2013-11-21 11 views

答えて

1

@Andreyあなたが提示した点に同意しますが、私が効果的なJavaブックから得た本当の答えに同意します。 Item#22静的メンバークラスを非静的クラスよりも優先します。

プライベート静的メンバクラスの一般的な用途は、値を持つキーを関連付けるマップインスタンスを、その封入class.For 例によって表されるオブジェクトの 成分を表す考慮することです。 マップの多くのマップ実装では、マップ内の各 のキーと値のペアの内部Entryオブジェクトがあります。各エントリはマップに関連付けられていますが、 エントリのメソッド(getKey、getValue、およびsetValue)には、 のマップへのアクセスは必要ありません。したがって、エントリを表すために非静的な メンバクラスを使用するのは無駄でしょう。プライベートな静的メンバクラスは が最適です。

あなたはこの修飾子を省略し、常にそのdeclaration.Ifにstatic修飾子を入れて、 親インスタンスへのアクセスを必要としないメンバーのクラスを宣言した場合、各インスタンスは その親インスタンス

に無関係な参照を持っています

たくさんもっと良いもの私は22番のアイテムから得たものが主なポイントです。

6

基本的に、それらの囲むクラスのプロパティを使用する必要のないすべての内部クラスは、staticとなっています。これは、すべてのオブジェクトが可能な限り最小限のオブジェクトにアクセスできるようにするというJavaの一般原則から来ています。

+0

でも、他のクラスから内部クラスにアクセスする可能性が1つ追加されます。 – Vipin

+0

「** it **」とは何を参照していますか? –

+0

"it"は、これらのクラスの現在の実装を意味します。現在のセグメントのシグネチャは "static final class Segment ReentrantLockはSerializablを実装しています" – Vipin

2

各インナー非静的クラスは、エンティティ(Segment又はHashEntry)当たり8バイトのオーバーヘッドを作成し、親オブジェクト(ConcurrentHashMap)です参照不可視フィールドthis$を含有します。これは、親クラスのフィールドにアクセスする方法です。内部クラスは、単一のコンテナ(親など)に属するオブジェクトのシンタックスシュガーです。

このため、可能であれば、内部クラスを静的内部クラスに置き換える必要があります。

+0

これは1つの良い点ですが、なぜこのクラスがプライベートでないのはなぜですか? – Vipin

+0

パッケージのプライベートに似ているパッケージローカルです。彼らの意図は何か分かりませんが、通常、プライベートエンティティはユニットテストのためにパッケージローカルに作られ、別のクラス(ユニットテスト)からアクセスすることができます。 –

+0

おそらくテスト目的のためだけにJavaの人はデザインで遊ぶことはありません、私はどのように著者Doug Leaに尋ねることができるのか分かりません。 – Vipin

0

インナースタティッククラスは、遅延ロードのように1つの美しい機能を持っています。具体的には、Bill Pugh Singleton実装では、シングルトンパターンを実装します。

静的内部クラスが提供するその他の機能は、外部インスタンス変数にアクセスできないことです。ここからは、非静的メソッドにもアクセスできません。その静的クラスを初期化するために個別のインスタンスを作成する必要はありません。直接ClassName.InnerStaticClass.method()を使用して、メソッドを呼び出すことができます。

関連する問題