2012-03-13 11 views
0

私はJavaを使い始めたばかりで、頭の中にはいくつかの概念を理解しています。 チュートリアルJava tutorialに従っています。しかし、私は静的入れ子クラスを使用することの有用性を見つけることができません。なぜ私はそれを使いたいのかという良い例が必要だと思うのです。誰かが私にいくつかのコードを例として提供できるので、私はそれをよりよく理解できるでしょうか? thaxJavaの静的ネストされたクラスは何ですか?

+3

以下を参照してください:http://stackoverflow.com/questions/253492/static-nested-class-in-java-why – darijan

答えて

3

「通常の」クラスに比べて静的なネストされたクラスの利点は、それを使用して2つのクラス間の関係を反映できることです。

例えば、JDKでは、java.util.Mapjava.util.Map.Entryがあります。

​​はpublic static interfaceと宣言されており、このようにしてこの関係を明示すると、その関係はMapに明確に示されます。それはjava.util.MapEntryと定義されているかもしれませんが、静的なネストされたインターフェイスとしてそれを行うことは、それがMapと強い関係があることを明らかにします。

したがって、ネストされたクラスがその親のコンテキストでのみ使用される場合は、静的ネストされたクラスを使用することになります。

+0

これは確かに静的なネストされたクラスをプログラムするための論理的な方法ですが、静的なネストされたクラスは親クラスについては何も知りません。実際には "Zoo"という外部クラスをプログラムし、 "Zoo"クラスとは関係のない静的入れ子クラス "GalacticWarfare"を持つことができます。 –

0

ネストまたはインナークラスは、他のクラスに定義されている通常のクラスです。これを行う理由は、典型的には、内部クラスを他のクラスから隠すことであり、すなわち、カプセル化のさらに別のレベルである。

内部クラスはプライベート、プロテクト、パブリックにすることができ、フィールドやメソッドとまったく同じ意味を持ちます。

内部クラスがプライベートでない場合、外部からもアクセスできます。その名前はOuterClass.InnnerClassです。入れ子の深さはJavaの仕様に制限されていないので、内部クラスは独自の内部クラスなどを持つことができます。

内部クラスが静的でない場合、外部クラスのメソッドとフィールドを呼び出すことができます。

内部クラスも匿名である可能性があります。これは、小さなコールバックやイベントハンドラなどに非常に便利です。

他の具体的な質問をすることをためらってください。

1

次の例は、Java初心者用ではないかもしれませんが、静的入れ子クラスの良い例は、Builder patternを使用して外部クラスの不変オブジェクトを構築する場合です。静的ネストされたクラスは、外部クラスのプライベートメンバーにアクセスすることができ、プライベートコンストラクタを持ち、外部クラスのプライベートフィールドを初期化しますが、外部クラスのオブジェクトを構築できます。 など。私は追加する必要があります

public class SomeClass { 
    private int someField; 
    private int someOtherField; 

    private SomeClass() 
    {} 

    public static class SomeBuilder { 
     private int someField; 
     private int someOtherField; 

     public SomeBuilder setSomeField(int someField) 
     { 
      this.someField = someField; 
      return this; 
     } 

     public SomeBuilder setSomeOtherField(int someOtherField) { 
      this.someOtherField = someOtherField; 
      return this; 
     } 

     public SomeClass build() throws ValidationException 
     { 
      validateFields();    

      SomeClass someClass = new SomeClass(); 
      someClass.someField = someField; 
      someClass.someOtherField = someOtherField; 
      return someClass; 
     } 

     private void validateFields() throws ValidationException { 
      //Validate fields 
     } 
    } 

    public int getSomeField() { 
     return someField; 
    } 
    public int getSomeOtherField() { 
     return someOtherField; 
    } 
} 
+0

注 - 静的ネストされたクラスは、外部クラスのインスタンス変数および非静的メソッドにアクセスできません。 –

+0

ネストされた静的クラスが外部クラスのオブジェクトを作成する場合、この例では外部クラスのすべてのプライベートメンバーにアクセスできます。 –

+0

右 - 私は内部クラスのネイティブ能力を静的ネストされたクラスと区別しています。内部クラスは実際に外部クラスとの関係を持ち、外部クラスメンバーに直接アクセスすることができます。静的ネストされたクラスはそうではありません。あなたの例では、静的ネストされたクラスに外部クラスのインスタンスを作成しました。それ以外の場合は、静的ネストされたクラスは実際に外部クラスと暗黙の関係を持ちません。 –

0

もう一つは、内部クラスがない静的なものである場合、そのインスタンスは自動的にその親クラスのインスタンスへの参照を持っているということです。 NameOfOuterClass.thisを使用して参照できます。

しかし、の静的な場合は、それはありません。

これは、とりわけ、GC(ガベージコレクション)中に機能します。 内部クラスのオブジェクトがGCedされていない場合、参照する外部クラスオブジェクトもGCedされません(内部クラスが静的でない場合)。

関連する問題