私はJavaを使い始めたばかりで、頭の中にはいくつかの概念を理解しています。 チュートリアルJava tutorialに従っています。しかし、私は静的入れ子クラスを使用することの有用性を見つけることができません。なぜ私はそれを使いたいのかという良い例が必要だと思うのです。誰かが私にいくつかのコードを例として提供できるので、私はそれをよりよく理解できるでしょうか? thaxJavaの静的ネストされたクラスは何ですか?
答えて
「通常の」クラスに比べて静的なネストされたクラスの利点は、それを使用して2つのクラス間の関係を反映できることです。
例えば、JDKでは、java.util.Map
とjava.util.Map.Entry
があります。
はpublic static interface
と宣言されており、このようにしてこの関係を明示すると、その関係はMap
に明確に示されます。それはjava.util.MapEntry
と定義されているかもしれませんが、静的なネストされたインターフェイスとしてそれを行うことは、それがMap
と強い関係があることを明らかにします。
したがって、ネストされたクラスがその親のコンテキストでのみ使用される場合は、静的ネストされたクラスを使用することになります。
これは確かに静的なネストされたクラスをプログラムするための論理的な方法ですが、静的なネストされたクラスは親クラスについては何も知りません。実際には "Zoo"という外部クラスをプログラムし、 "Zoo"クラスとは関係のない静的入れ子クラス "GalacticWarfare"を持つことができます。 –
ネストまたはインナークラスは、他のクラスに定義されている通常のクラスです。これを行う理由は、典型的には、内部クラスを他のクラスから隠すことであり、すなわち、カプセル化のさらに別のレベルである。
内部クラスはプライベート、プロテクト、パブリックにすることができ、フィールドやメソッドとまったく同じ意味を持ちます。
内部クラスがプライベートでない場合、外部からもアクセスできます。その名前はOuterClass.InnnerClass
です。入れ子の深さはJavaの仕様に制限されていないので、内部クラスは独自の内部クラスなどを持つことができます。
内部クラスが静的でない場合、外部クラスのメソッドとフィールドを呼び出すことができます。
内部クラスも匿名である可能性があります。これは、小さなコールバックやイベントハンドラなどに非常に便利です。
他の具体的な質問をすることをためらってください。
次の例は、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;
}
}
注 - 静的ネストされたクラスは、外部クラスのインスタンス変数および非静的メソッドにアクセスできません。 –
ネストされた静的クラスが外部クラスのオブジェクトを作成する場合、この例では外部クラスのすべてのプライベートメンバーにアクセスできます。 –
右 - 私は内部クラスのネイティブ能力を静的ネストされたクラスと区別しています。内部クラスは実際に外部クラスとの関係を持ち、外部クラスメンバーに直接アクセスすることができます。静的ネストされたクラスはそうではありません。あなたの例では、静的ネストされたクラスに外部クラスのインスタンスを作成しました。それ以外の場合は、静的ネストされたクラスは実際に外部クラスと暗黙の関係を持ちません。 –
もう一つは、内部クラスがない静的なものである場合、そのインスタンスは自動的にその親クラスのインスタンスへの参照を持っているということです。 NameOfOuterClass.this
を使用して参照できます。
しかし、がの静的な場合は、それはありません。
これは、とりわけ、GC(ガベージコレクション)中に機能します。 内部クラスのオブジェクトがGCedされていない場合、参照する外部クラスオブジェクトもGCedされません(内部クラスが静的でない場合)。
- 1. 静的ネストされたクラスのセキュリティJAVA
- 2. 静的ネストされたクラス
- 3. Javaで静的ネストされたクラスにアクセスする方法
- 4. Java静的ネストされた型セマンティック
- 5. 継承と静的ネストされたJavaクラス
- 6. 静的なネストされたクラスと非静的なエラー
- 7. 静的でないネストされたスレッド - 別のクラスからのアクセス(Java)
- 8. 静的ネストされたクラスから非静的ネストされたクラスの非静的メソッドにアクセスすることができます
- 9. JavaのようにC++に静的ネストされたクラスがありますか?
- 10. ネストされたクラス:静的コンテキストで非静的フィールドにアクセスできません
- 11. リフレクションはシングルトン静的ネストされたクラスのフィールド
- 12. は、私は、ネストされたプライベート静的クラスのjavaをインスタンス化するにはどうすればよい
- 13. インターフェイス内のネストされたクラスは暗黙的に静的で最終的ですか?
- 14. ネストされた静的クラスでは拡張メソッドは使用できません。
- 15. Visual Studioのネストされた静的ライブラリ?
- 16. java.lang.Thread実装の静的ネストされたクラスが表示されないのはなぜですか?
- 17. Javaの静的{...}と同じC#は何ですか? Javaでは
- 18. eclipse/javaのネストされたプロジェクトは何ですか?
- 19. JUnit 5の目的は何ですか@ネストされた注釈
- 20. Rjbを使ってネストされた静的クラスにアクセスする方法は?
- 21. インターフェイスにネストされた非静的クラスを実装する方法は?
- 22. Javaアプレット静的クラス
- 23. 同期化されたキーワードとJavaの静的クラス
- 24. 親クラスの静的イベントハンドラがネストされたクラスのProcess.Exitedからトリガされない
- 25. ネストされたリアルタイムデータベースへのJavaクラス
- 26. 複数のネストされたクラスJava
- 27. 内部クラスをJavaで静的にする利点は何ですか?
- 28. Javaの非静的クラスで静的変数を宣言する
- 29. オブジェクト参照を介してインスタンス変数にアクセスする静的ネストされたクラスのJavaの例
- 30. Javaでは、クラス内の列挙型は静的ですか?
以下を参照してください:http://stackoverflow.com/questions/253492/static-nested-class-in-java-why – darijan