2010-12-31 18 views
1


私はgoogle guiceのソースを調べていて、よく知られていないコードを見つけました。もし誰かがそれを明確にすることができれば偉大な学習になるでしょう。Java:インターフェースの内部クラス(google guiceから)

私はインナークラスを非常に基本的に理解しています。インプリメンテーションの詳細をパブリックインターフェイスに近づけるためです。さもなければ、内部クラスは名前空間を汚染するかもしれません。

今、私はそれが静的変数に内部クラスのインスタンスを割り当てるが、スコープ(at

パブリックインターフェーススコープ

として定義されるインタフェースである下行 at

public static final Scope SINGLETON = new Scope() { 
    public <T> Provider<T> scope(final Key<T> key, final Provider<T> creator) { 
     return new Provider<T>() { 
......... 
} 

参照

パート1:

インターフェイスをインスタンス化することはできますか?またはインターフェイスの匿名実装のための簡潔な構文ですか?

パート2:

誰でも著者は(スコープとプロバイダ)上記複数のネストされたクラスによって意図されたものを説明することができ、そしてなぜそれがこの方法を実装するために理にかなっている場合、それがために私を助けますわかる。ありがとう。

+0

[これはインターフェイスからオブジェクトを作成するように見えます。どのように動作するのですか?](http://stackoverflow.com/questions/3947708/this-appears-to-create-an-object-from-an-interface-how-does-it-work) –

+0

@Bert、同意、この質問はguice特有の問題ではなく、Javaの一般的な質問です。 –

+0

@Mike - 良い目 - 将来のサーチャーのためにタグが更新されました –

答えて

2

{} -block afterは、指定されたインターフェイスを実装する匿名の内部クラスを作成します。

Runnableでよく見られます。

+0

私の前提を確認する明確化のために感謝します。私はqnで正しくマークした部分へのポインタを与えることができますか?再びUR時間ありがとう。 – bsr

+0

呼び出しの後でコンパイラに見えるのは 'Scope 'なので、他のものにキャストすることはできません(使用できる名前がないことに注意してください)。この理由は、プロバイダを返すスコープが必要であり、作成者がこれらの名前付き実装のいずれかを指定する理由を見なかったからです。おそらくそれは単純なためです。 –

2

インターフェイスをインスタンス化することはできますか?またはインターフェイスの匿名実装のための簡潔な構文ですか?

Yupとyup。

This appears to create an object from an interface; how does it work?

What does the syntax mean in Java: new Stream<Integer>(){ ... }?

誰でも著者は

上記複数のネストされたクラスによって意図されたものを説明することができた場合の例3.11は http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

public java.util.Enumeration enumerate() { 
    // The anonymous class is defined as part of the return statement 
    return new java.util.Enumeration() { 
     .... 
    }; // Note the required semicolon: it terminates the return statement 
} 

でEnumerationインタフェースをインスタンス化

ネスティングに特別なものはありません - 匿名クラスと匿名クラスを使用するのと同じ理由で、匿名クラスを使用します。インターフェイスまたはサブクラスのための使い捨て実装がある場合、つまり、定義/実装から使用。

関連する問題