1. ホーム

[解決済み】Javaでfinalキーワードを使用するとパフォーマンスが向上しますか?

2022-04-16 02:01:45

質問

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

例えば

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

上記の場合 strfinal が、これは一般的に省かれる。

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

これらすべてのケースでfinalキーワードを使用すると、本当にパフォーマンスが向上するのでしょうか?もしそうなら、どのように?説明してください。もし final Javaプログラマーは、どのような習慣を身につければ、このキーワードを有効に活用できるでしょうか?

どのように解決するのですか?

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

(もちろん、これはHotSpotを使っていると仮定しての話ですが、HotSpotは圧倒的に一般的なJVMですからね...)。

私の考えでは final は、パフォーマンス上の理由ではなく、明確な設計と可読性に基づくものです。もしパフォーマンス上の理由で何かを変更したいのであれば、最も明確なコードを変形させる前に適切な測定を行うべきです - そうすれば、達成される追加パフォーマンスが可読性やデザインの悪化に見合うかどうかを判断できます。(私の経験では、その価値があることはほとんどありません。)

編集部:ファイナルフィールドについて言及されていますが、明確なデザインの観点から、ファイナルフィールドはしばしば良いアイデアであることを提起しておく価値があると思います。コンストラクタが完了した後、最終フィールドは他のスレッドですぐに見えるようになることが保証されます。これはおそらく、最も一般的な final 私の経験では、Josh Blochの「継承のための設計か禁止か」という経験則の支持者として、私はおそらく final クラスにはもっと頻繁に...