4

メソッドでキーワードを使用する方法の 1 つは、finalサブクラスに同じメソッド実装を強制的に使用させることです。しかし、コンパイラがメソッドの呼び出しをインライン Java コードに変換できるようにすることで効率が向上するとは、どういう意味でしょうか? 私はこれを読んだだけですが、その考えがよくわかりません。

この程度では、インライン Java コードの意味がわかりません。メソッドの呼び出しはどのようにfinal実行されますか? メソッドを呼び出すコードのコンパイル中に Java が通知または実行する特別なことはありfinalますか?

4

2 に答える 2

5

Java バイトコード コンパイラは通常、最適化の方法をほとんど行わないため、final を使用してもバイトコードの効率が大幅に向上または低下することはありません。効率ボーナス (ある場合) は、JIT コンパイラーによって生成されるネイティブ コードにあります。

理論的には、final を使用すると、最適化に役立つヒントが JIT コンパイラに提供されます。実際には、最近の HotSpot JIT コンパイラーは、ヒントを無視することでより良い仕事をすることができます。たとえば、最新の JIT コンパイラは通常、グローバル分析を実行して、特定のメソッド呼び出しが、アプリケーションの現在ロードされているクラスのコンテキストでリーフ メソッドへの呼び出しであるかどうかを調べます。この分析は、最終的なヒントよりも正確であり、ランタイムは、分析を無効にする新しいクラスが読み込まれたことを検出することさえできます...そして、影響を受けるコードの分析とネイティブ コード生成をやり直します。

したがって、ベスト プラクティスは、final を使用して (大まかに言えば) デザインの意図を表現し、必要なその他のセマンティック効果を実現することです。(たとえば、 final 修飾子を使用すると、スレッドセーフな不変型を実装する際に重要な役割を果たすことができます。) final を最適化のヒントとして使用すると、多くのことは達成できず、コードの変更と拡張が難しくなります。

フォント:リンク

于 2013-08-23T14:22:50.437 に答える