32

Java クラスに内部クラスがあります。

ここに画像の説明を入力

find bugsを実行すると、静的にすることをお勧めします(警告します)。

ここに画像の説明を入力

この警告のポイントは何ですか? 内部クラスを静的にする利点は何ですか?

4

6 に答える 6

31

ネストされたクラスが外側のクラスの変数のいずれにもアクセスしない場合は、静的にすることができます。この利点は、ネストされたクラスを使用するために外側のクラスのインスタンスを囲む必要がないことです。

于 2013-04-22T12:45:11.793 に答える
15

内部クラスは、デフォルトで、外部クラスのオブジェクトへの暗黙的な参照を持っています。外部クラスのコードから this のオブジェクトをインスタンス化すると、これはすべて自動的に行われます。それ以外の場合は、オブジェクトを自分で提供する必要があります。

static 内部クラスにはこれがありません。

つまり、外部クラス オブジェクトのスコープ外でインスタンス化できるということです。また、内部クラスのインスタンスを「エクスポート」しても、現在のオブジェクトの収集が妨げられないことも意味します。

基本的なルールとして、内部クラスが外部クラスにアクセスする理由がない場合は、デフォルトで静的にする必要があります。

于 2013-04-22T12:45:56.407 に答える
7

静的内部クラスは、意味的に単純なものです。可視性に関するオプションが多いことを除けば、トップレベル クラスと同じです (たとえば、プライベートにすることができます)。

非静的内部クラスを避ける重要な理由は、それらがより複雑であることです。外部クラスへの非表示の参照があります (複数の場合もあります)。また、内部クラスのメソッド内の単純な名前は、ローカル、フィールド、または外部クラスのフィールドの 3 つのうちの 1 つになる場合があります。

その複雑さの結果として、外部クラスへの非表示の参照がメモリ リークを引き起こす可能性があります。内部クラスがリスナーであり、静的内部クラスである可能性があるとします。リスナーが登録されている限り、リスナーは外部クラスのインスタンスへの参照を保持し、大量のメモリを保持する可能性があります。リスナーを静的にすると、外側のインスタンスがガベージ コレクションされる可能性があります。

于 2013-04-23T16:53:45.230 に答える
5

非静的内部クラスには、外部クラスへの暗黙的な参照があります。クラスを静的にすると、メモリとコードを節約できます。

于 2013-04-22T12:45:34.313 に答える