1

これらのアプローチの間に実際的な違いはありますか? (メモリ、GC、パフォーマンスなど?)

while...{
   Object o=new Object();
   ...
   o=new Object();
   ...
}

Object o;
while...{
   o=new Object();
   ...
   o=new Object();
   ...
}
4

4 に答える 4

2

有効な Java 2nd Editionから:

ローカル変数のスコープを最小化するための最も強力な手法は、最初に使用される場所で宣言することです。変数が使用される前に宣言されている場合、それは単なる混乱です。プログラムが何をするかを理解しようとしている読者の気を散らすもう 1 つのことです。変数が使用されるまでに、リーダーは変数の型または初期値を覚えていない可能性があります。

ローカル変数を時期尚早に宣言すると、そのスコープがあまりにも早く拡張されるだけでなく、あまりにも遅く終了する可能性があります。ローカル変数のスコープは、宣言された場所から囲んでいるブロックの末尾までです。変数が使用されているブロックの外で変数が宣言されている場合、プログラムがそのブロックを終了した後も変数は表示されたままになります。意図した使用領域の前後で変数が誤って使用されると、悲惨な結果になる可能性があります。

つまり、パフォーマンス(CPU、メモリ)の違いはあなたの場合には関係ありません。はるかに重要なのは、プログラムのセマンティクスと正確さです。これは、最初のコード例の方が優れています。

于 2012-11-09T19:00:32.277 に答える
1

オプション 1 の場合、オブジェクトはループが終了するまで一度だけ GC の対象になりますが、オプション 2 の場合、オブジェクトはメソッドが終了するまで存続します。

于 2012-11-09T17:29:48.657 に答える
1

最初の例でoは、 while ループが終了した後に範囲外になります。

ここで、while ループの外側で実際に使用しない場合(参照するオブジェクトを別の構造体にロードした場合でも)、これは問題ありませんが、ループの外側oにアクセスすることはできません。o

また、これはちょっとしたことですが、Object o2回宣言するため、どちらもコンパイルされません。

于 2012-11-09T16:31:29.910 に答える
1

オブジェクトの再利用と、ガベージ コレクションの適格性 + 可読性との間でトレードオフが必要だと思います。

最小限のスコープは常に読みやすさを向上させ、エラーの発生を最小限に抑えます。

繰り返しになりますが、オブジェクトの作成にコストがかかりすぎる場合 (スレッド、データベース接続など) は、再利用を検討する必要があります。通常、ループ内では作成されず、プールにキャッシュされます。

そのため、接続プーリングとスレッド プールが非常に人気があります。

于 2012-11-09T16:34:28.517 に答える