3

メソッド引数で使用finalすると、コンパイラまたはランタイム環境がより高速に動作するようになりますか? たとえば、変更されずそのまま使用されることがわかっているメソッドに渡す変数がある場合、それを宣言する方が効率的finalですか?

例: 最初の方法は 2 番目の方法よりも高速である必要があります

public int isLargerAfterTripledFaster(int num, final int limit) {
    num *= 3;
    return (num > limit);
}

public int isLargerAfterTripled(int num, int limit) {
    num *= 3;
    return (num > limit);
}

ここで変更可能な変数を渡したくないと確信できる場合は、この手法を使用する必要がありますか?

4

3 に答える 3

3

finalパフォーマンスへの影響はまったくありません。JIT コンパイラーは final をまったく考慮しません。

Brian Goetz の Java final に関する記事も参照してください。

于 2013-08-09T15:51:20.780 に答える
3

現在の Java コンパイラは、すでに優れたデータ フロー分析を行っています。これは、変更不可能なパラメーターを持つステートメントです。これを利用できるのは、愚かなコンパイラだけです。

ただし、読者にとっては良いヒントです。そして、コードは一度書かれれば、何度も読み返されます。

一般に、「パラメーターは決して上書きされるべきではない」と言って、いくつかのスタイルガイドによって強制されます。

より良い理由は、内部クラスでの使用です。メソッド コンテキストではパラメーターとローカル変数が final である必要があるためです。

ただし、最終的な方法です。オーバーライドできないものには、最適化の可能性があります。

public final int isLargerAfterTripled(int num, int limit) { ... }

メソッドは決してオーバーライドされないため、コンパイラは関数コードをインライン化する場合があります。

于 2013-08-09T15:50:21.917 に答える