3

クラスがfinalとして宣言されている場合、そもそもメソッドをオーバーライドするにはサブラスが必要なため、そのメソッドを事実上オーバーライドできないことを私は知っています。そうは言っても、これは、そのクラスのすべてのメソッドの前で「final」と入力するのとまったく同じであるかどうか疑問に思います。

私がこれを求めている理由は、メソッドをfinalにすることで、メソッドの一部がより高速に実行される可能性があるためです。私が疑問に思っているのは、このスピードアップの利点が、finalと宣言されたクラス内のすべてのメソッドに自動的に等しく存在するのか、それともこの利点を引き出すためにメソッドを明示的にfinalにする必要があるのか​​ということです。

ありがとう!

4

1 に答える 1

3

最終クラスを拡張することはできないため、そのメソッドをオーバーライドすることはできません。メソッドが final であるかどうかについて話すのは、あまり意味がありません。

最終メソッドの理論上の速度の向上は、コンパイラが意味のある状況で関数をインライン化できるためです。コンパイラがいつそれを行うかを正確に予測することは難しく、ほとんどの場合、違いに気付くことはありません。文書化されていません(または私の知る限りではありません)が、ヒューリスティックは関数が短く、ループで使用されていることに基づいていると思います。そのような状況では、関数ラッパーのオーバーヘッドは、含まれるコードと比較して重要になります。

注:argumentsオブジェクトを使用する関数のインライン化はできません。

実際には、ほとんど速度の違いに気付かないでしょう。しかし、測定できるケースを構築できれば、メソッドではなくクラスを final にすることで簡単にテストできます。

編集: FWIW、私はこれを試しましたが、メソッドを使用する場合と使用しない場合の違いを測定できませんでしfinalた。finalクラスでの使用も同じでした。このSOの答え は同じ結論に達します。

于 2013-03-01T00:32:38.430 に答える