3

フォーマッターをループで再利用する方法はありますか?それとも単にインスタンス化してガベージ コレクターに処理させるだけですか? (これは Java の質問です)。インスタンス化をループから外すと、ループを介した以前の反復のフォーマットされたコンテンツが追加されることに注意してください。Formatter.flush() は、その名の通りフラッシュするだけのようで、白紙の状態で再利用できるという利点はありません。

例:

for (...)
{
    Formatter f = new Formatter();
    f.format("%d %d\n", 1, 2);
    myMethod(f.toString());
}
4

4 に答える 4

9

次のように使用できます。

StringBuilder sb = new StringBuilder();
Formatter f = new Formatter(sb);

for (...)
{
    f.format("%d %d\n", 1, 2);
    myMethod(sb.toString());
    sb.setLength(0);
}

これにより、Formatter と StringBuilder が再利用されますが、ユース ケースのパフォーマンスが向上する場合とそうでない場合があります。

于 2011-05-24T08:22:49.363 に答える
1

の標準実装Formatterは「ステートフル」です。つまり、それを使用すると内部状態が変更されます。これにより、再利用が難しくなります。

試すことができるいくつかのオプションがあります。

  1. それがあなたのコードであればreset()、内部状態をクリアするメソッドを追加できます。短所: このメソッドを呼び出すのを忘れると、悪いことが起こります。

  2. 代わりに、内部状態を変更する場合は、書式設定された結果を で返すことができますformat()。内部状態がなくなったため、reset()メソッドなしでオブジェクトを再利用できるため、より安全に使用できます

ただし、これは標準 API であるため、変更することはできません。

ループ内で新しいオブジェクトを作成するだけです。Java でオブジェクトを作成するのは非常に安価であり、それらを忘れても何の費用もかかりません。ガベージ コレクションに費やされる時間は、コードが生成する死んだオブジェクトの量ではなく、生きているオブジェクトの数に比例します。基本的に、GC は他のオブジェクトに接続されていないオブジェクトを完全に認識しません。したがってnew、ループで 10 億回呼び出しても、GC は認識しません。

于 2011-05-24T08:27:16.953 に答える
0
為に (...) {
    myMethod(String.format("%d %d\n", 1, 2));
}
于 2011-05-24T08:26:18.090 に答える
0

新しいものをインスタンス化して、古いものをガベージ コレクションにします。

于 2011-05-24T08:21:12.630 に答える