これらのアプローチの間に実際的な違いはありますか? (メモリ、GC、パフォーマンスなど?)
while...{
Object o=new Object();
...
o=new Object();
...
}
と
Object o;
while...{
o=new Object();
...
o=new Object();
...
}
これらのアプローチの間に実際的な違いはありますか? (メモリ、GC、パフォーマンスなど?)
while...{
Object o=new Object();
...
o=new Object();
...
}
と
Object o;
while...{
o=new Object();
...
o=new Object();
...
}
有効な Java 2nd Editionから:
ローカル変数のスコープを最小化するための最も強力な手法は、最初に使用される場所で宣言することです。変数が使用される前に宣言されている場合、それは単なる混乱です。プログラムが何をするかを理解しようとしている読者の気を散らすもう 1 つのことです。変数が使用されるまでに、リーダーは変数の型または初期値を覚えていない可能性があります。
ローカル変数を時期尚早に宣言すると、そのスコープがあまりにも早く拡張されるだけでなく、あまりにも遅く終了する可能性があります。ローカル変数のスコープは、宣言された場所から囲んでいるブロックの末尾までです。変数が使用されているブロックの外で変数が宣言されている場合、プログラムがそのブロックを終了した後も変数は表示されたままになります。意図した使用領域の前後で変数が誤って使用されると、悲惨な結果になる可能性があります。
つまり、パフォーマンス(CPU、メモリ)の違いはあなたの場合には関係ありません。はるかに重要なのは、プログラムのセマンティクスと正確さです。これは、最初のコード例の方が優れています。
オプション 1 の場合、オブジェクトはループが終了するまで一度だけ GC の対象になりますが、オプション 2 の場合、オブジェクトはメソッドが終了するまで存続します。
最初の例でo
は、 while ループが終了した後に範囲外になります。
ここで、while ループの外側で実際に使用しない場合(参照するオブジェクトを別の構造体にロードした場合でも)、これは問題ありませんが、ループの外側o
にアクセスすることはできません。o
また、これはちょっとしたことですが、Object o
2回宣言するため、どちらもコンパイルされません。