Javaでネストされたクラスを使用する利点は何ですか? 多くの例では、設計が複雑になるだけのように思えます。たとえば複合パターンと比較して、ネストされたクラスを使用することの力を示す例はありますか?
6 に答える
ネストされたクラスを使用する理由
入れ子になったクラスを使用する説得力のある理由がいくつかあります。
- これは、1 つの場所でのみ使用されるクラスを論理的にグループ化する方法です。
- カプセル化を高めます。
- ネストされたクラスは、コードをより読みやすく保守しやすくすることができます。
(ドキュメントから)
私が考えることができる最良のケースは、ある種のコレクション クラス (ツリー、リンク リスト、マップなど) でノードを実装することだと思います。ノードの実装を一般に公開する理由はありません。コレクションの内部でのみ使用されるため、ノード クラスをコレクション クラス内にネストすることは理にかなっています。
の線に沿った何か..
public class MyTree {
private class TreeNode {
//implementation details...
}
//public api, where implementation references TreeNode
}
ネストされたクラスは、周囲のクラス内でこのクラスが必要な場合に使用します。これは、イベント リスナーのような使用法である可能性があります。
または、API メソッドへのパラメーターとして特定のインターフェイスを実行し、この特定の最上位クラスでのみこの構造を作成する必要がある場合。
これにより、他のクラスにとって役に立たない最上位クラスの作成 (コード ベースの混乱) が回避されます。
お役に立てれば。:)
たとえば、複合パターンと比較して、ネストされたクラスを使用することの力を示す例はありますか?
ほぼすべての Iterator 実装と、keySet() および values() の実装はネストされています。実際の名前は重要ではありませんが、作業を行うには外部クラスにアクセスする必要があります。
これらをトップレベルのクラスにすることは、洗練されていないか、カプセル化されていません。
ネストされたクラスを使用するために考えることができる多くの例があります
1- 通常とは異なる動作でこのインスタンス内で使用する目的でクラスを拡張する (メソッドまたはそれ以上をオーバーライドする)
2-イベントリスナーを実装して任意のメソッドに1つのステップで渡すための省略形
3- 特定性が高すぎてグローバルに定義できないクラスを実装する (または、パッケージの可視性やプライベートなどを使用して)。そして、それをより大きなクラスに隠したいだけです
for フォーマッタを美しく作ろうとしても、内部クラスを使用するとコードが複雑になることに同意しますが、それには用途があります。上記のいずれかが適用され、そのサイズはコードを破壊しないように最小限に抑えられます
そしてその問題のために、すべてのコードを最小限に抑えてください:)
このクラスが主に、それが書き込まれるクラスによってのみ使用されることがわかっている場合、ネストされた (内部) クラスを使用します。パッケージ構造をよりクリーンに保ちます。パッケージ構造にリストされていないクラスを簡単に見つけることができる IDE を利用することで、複雑さが軽減されます。
実際の例が要求ArrayList
されたので、jdk の実装を見てください。
ここで見つけることができます:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/ArrayList.java#ArrayList
(特に) Arraylist クラス内に iterator クラスがあります。この動作の理由 (ほとんどの反復可能なコレクション サブクラスと同様) は、コレクションとその反復子の間の直接接続にあると思います。クラス外では必要ありません。
jdk 内のより多くの場所で、ネストされたクラスを見つけることができます。