web-dev-qa-db-ja.com

Javaでメソッドパラメータを最終的に宣言するパフォーマンス上の理由はありますか?

Javaでメソッドパラメータを最終的に宣言するパフォーマンス上の理由はありますか?

次のように:

_public void foo(int bar) { ... }
_

対:

_public void foo(final int bar) { ... }
_

barは読み取り専用であり、foo()で変更されることはないと仮定します。

117
Kip

Finalキーワードは、ローカル変数およびパラメーターのクラスファイルに表示されないため、ランタイムのパフォーマンスに影響を与えることはできません。唯一の用途は、変数が変更されないことをコーダーの意図を明確にすることであり(多くの場合、その使用の疑わしい理由と考えられます)、匿名の内部クラスを処理します。

メソッドは修飾子に関係なく、実行時に最適化コンパイラによってインライン化されるため、メソッド自体の最終修飾子にパフォーマンスの向上があるかどうかについて多くの議論があります。この場合、メソッドのオーバーライドを制限するためにのみ使用する必要があります。

95
Robin

Finalパラメーターの唯一の利点は、匿名のネストされたクラスで使用できることです。パラメーターが変更されない場合、コンパイラーは、最終修飾子がなくても、通常の操作の一部として既にそれを検出します。バグが予期せずに割り当てられたパラメーターによって引き起こされることは非常にまれです-メソッドがこのレベルのエンジニアリングを必要とするほど大きい場合、それらを小さくします-呼び出すメソッドはパラメーターを変更できません。

14

メソッド内で宣言された最終ではないローカル変数を使用すると、内部クラスインスタンスがスタックフレームより長く残る可能性があるため、内部オブジェクトがまだ生きている間にローカル変数が消滅する可能性があります

0
user666

JITコンパイラなど、クラスのロード後に動作するコンパイラは、finalメソッドを利用できます。その結果、finalと宣言されたメソッドには、パフォーマンス上の利点があります。

http://www.javaperformancetuning.com/tips/final.shtml

ああ、もう一つの良いリソース

http://mindprod.com/jgloss/final.html

0
branchgabriel