によって異なります。この特定のケースでは、他の人があなたの質問に対処しています。一般的には、ループ内でオブジェクトをインスタンス化して若い世代のコレクションでクリーンアップする方がよい場合がありますが、常にそうであるとは限りません。 JavaのGCは、短命のオブジェクトに最適化されています。
変数のスコープは状況の論理に合致する必要がありますが、「より良い」というドグマはありません。オブジェクトのようなループの例と同様に、変数をより長生きかもしれない:ここ
Result result = null;
for (int ix = 0; ix < limit; ++ix) {
Result candidate = new Result();
if (condition()) {
result = candidate;
break;
}
}
if (result != null) { ...
は、candidate
変数がループの後範囲外です。非null
の値が割り当てられている場合、result
変数は元の参照よりも寿命の長いオブジェクトを指します。その他の候補者はすべてGCの資格があります。 (この例は設計されていますが、そのポイントを示すために調整されています)。
例外は、初期化オーバーヘッドが大きく、ループ内で繰り返されない場合です。オブジェクトの構築が大規模で、ループが大規模な作業を繰り返さずにオブジェクト状態の小さな部分のみを変更する場合は、ループ外にオブジェクトを作成することを検討することもできます。
「大量」はどれぐらいですか?それは知るのは難しいです。しかし、オブジェクトの作成はほとんど無料で、若い世代のGCも無料です。死んだオブジェクトは、若いGCのオーバーヘッドには貢献しません。オブジェクトが保護されている場合、GCのオーバーヘッドが増加するため、必要に応じて寿命を短く保つ必要があります。
ライフタイムマネジメントは、Javaプログラミングのダークアーツの1つです。できるだけ早くオブジェクトを投げ捨てることを好むなら、あなたはほとんど間違っていません。この経験則から逸脱するには、さまざまなライフサイクル戦術の違いを測定する必要があります。オブジェクトを長持ちさせるとパフォーマンスが大幅に向上する場合もありますが、それらを勉強すれば、多くの実験と正確なメトリックで結果が達成されています。
ユースケースによって異なります。場合によっては、ループ内で新しいオブジェクトをインスタンス化せずに処理を進めることはできません。 – TheLostMind
ループ内で実際に何もインスタンス化していないことに注意してください。 Matcherオブジェクト参照を宣言して、pattern.matcher()呼び出しから戻り値を受け取るようにしています。 I.あなたが投稿したコードには「新」はありません。 – geneSummons
@geneSummons彼は 'new'キーワードを直接使用しませんが、' Pattern'内の 'matcher'メソッドは'新しいMatcher(this、input) 'を作成して返します。技術的には、そこに新しいインスタンスを作成しています。 – Jimmy