Javaでfinalキーワードを使用するとパフォーマンスが向上しますか? 質問する

Javaでfinalキーワードを使用するとパフォーマンスが向上しますか? 質問する

finalJava では、キーワードを使用できる場所が多数ありますが、その使用は一般的ではありません。

例えば:

String str = "abc";
System.out.println(str);

上記の場合、strとすることができますfinalが、これは省略されるのが一般的です。

メソッドが決してオーバーライドされない場合は、final キーワードを使用できます。継承されないクラスの場合も同様です。

これらのケースのいずれかまたはすべてで final キーワードを使用すると、実際にパフォーマンスが向上しますか? そうであれば、どのように向上しますか? 説明してください。 の適切な使用がfinalパフォーマンスにとって本当に重要である場合、キーワードを最大限に活用するために Java プログラマーはどのような習慣を身につけるべきですか?

ベストアンサー1

通常はそうではありません。仮想メソッドの場合、HotSpot はメソッドが実際にオーバーライドされているかどうかを追跡し、メソッドがオーバーライドされていないという前提でインライン化などの最適化を実行できます。メソッドをオーバーライドするクラスがロードされた時点で、それらの最適化を元に戻す (または部分的に元に戻す) ことができます。

(もちろん、これは HotSpot を使用していることを前提としていますが、これは最も一般的な JVM なので...)

私の考えでは、finalパフォーマンス上の理由ではなく、明確な設計と読みやすさに基づいて使用する必要があります。パフォーマンス上の理由で何かを変更する場合は、最も明確なコードを変形させる前に適切な測定を行う必要があります。そうすれば、達成される追加のパフォーマンスが、読みやすさや設計の低下に見合うかどうかを判断できます。(私の経験では、その価値はほとんどありません。人によって異なります。)

編集: final フィールドについて触れたので、明確な設計という点では、いずれにしても、これらは多くの場合、良いアイデアであるということを指摘しておく価値があります。また、これらは、クロススレッドの可視性という点でも保証された動作を変更します。コンストラクタが完了した後、final フィールドは他のスレッドですぐに表示されることが保証されます。これは、final私の経験ではおそらく最も一般的な使用方法ですが、Josh Bloch の「継承用に設計するか、継承を禁止する」という経験則の支持者として、finalクラスではもっと頻繁に使用すべきでしょう...

おすすめ記事