Javaでメソッドパラメータをfinalと宣言するパフォーマンス上の理由はありますか?
次のように:
public void foo(int bar) { ... }
対:
public void foo(final int bar) { ... }
bar
は読み取り専用であり、変更されることはないと仮定しfoo()
ます。
Javaでメソッドパラメータをfinalと宣言するパフォーマンス上の理由はありますか?
次のように:
public void foo(int bar) { ... }
対:
public void foo(final int bar) { ... }
bar
は読み取り専用であり、変更されることはないと仮定しfoo()
ます。
final キーワードは、ローカル変数とパラメーターのクラス ファイルには表示されないため、実行時のパフォーマンスに影響を与えることはありません。唯一の用途は、変数が変更されないというコーダーの意図を明確にし (多くの人がその使用について疑わしい理由を考えている)、匿名の内部クラスを処理することです。
修飾子に関係なく、メソッドは実行時に最適化コンパイラによってインライン化されるため、メソッド自体の final 修飾子がパフォーマンスを向上させるかどうかについては、多くの議論があります。この場合、メソッドのオーバーライドを制限するためにのみ使用する必要があります。
final パラメーターの唯一の利点は、匿名のネストされたクラスで使用できることです。パラメーターが変更されていない場合、コンパイラーは、final 修飾子がなくても、通常の操作の一部としてそれを既に検出します。パラメーターが予期せず割り当てられたためにバグが発生することはほとんどありません。メソッドがこのレベルのエンジニアリングを必要とするほど大きい場合は、メソッドを小さくしてください。呼び出したメソッドでパラメーターを変更することはできません。
上記のメソッド内で宣言された非最終ローカル変数を使用するもう 1 つのポイント — 内部クラス インスタンスはスタック フレームよりも長く存続する可能性があるため、内部オブジェクトがまだ生きている間にローカル変数が消失する可能性があります。
クラスのロード後に動作するコンパイラ (JIT コンパイラなど) は、最終メソッドを利用できます。したがって、final と宣言されたメソッドは、パフォーマンス上の利点をもたらす可能性があります。
http://www.javaperformancetuning.com/tips/final.shtml
ああ、もう 1 つの優れたリソース
コンパイラーは、int などのプリミティブ型を持つプライベート static final 変数をすべて削除し、C++ マクロと同じようにコード内に直接インライン化できる可能性があると思います。
ただし、これが実際に行われるかどうかはわかりませんが、メモリを節約するために行うことができます。