2017-10-30 11 views
0

コンパイラの最終的なクラスの利点はありますか?クラスが最終的なものと非最終的なものであれば、最適化は行われますか? ライブラリコードでfinal宣言されたクラスがたくさんあるので、不思議です。最終クラスと非最終コンパイラの最適化

答えて

5

最初に最も重要なことを外に出しましょう:クラスを作ることfinalは、、主にです。プログラマーによってモデリングが決定されました。 finalと非finalクラスは異なるセマンティクスを持っているため、パフォーマンス上の理由からfinalを単に適用することはできません。

特にの場合は、finalのプロパティと不変量を保証できますか?クラスがではなく、finalである場合、サブクラスは、プロパティと不変量を破るような方法でメソッドをオーバーライドすることができます。

最も明白な例は、不変型を記述したい場合です。サブクラスがメソッドを変更可能なバージョンで単純にオーバーライドできる場合は、型が不変であるという保証はありません。不変の場合、となる必要があります。finalです。

Scala標準ライブラリ、Scalaプラットフォーム、およびより広範なScalaエコシステムとコミュニティには、多くの不変型があるため、多くのfinalクラスも存在します。

したがって、繰り返す:クラスfinalセマンティック意思決定であり、それは最適化とは関係ありません。あなたは一般的にfinalかどうか、それはどちらかfinalにする必要があり、その不変量を維持するために、あなたのクラスを作るの選択肢を持っていない、またはそれが、その場合には、それはfinalをすることはできません、基底クラスになるように設計されて。

コンパイラの最適化についての質問:はい、コンパイラには利点があります。実際にはfinalクラスほどではありませんが、約finalメソッドです。この時点でメソッドをオーバーライドできないことをコンパイラが証明しなければならない最適化がいくつかあります。一般に、これはHalting Problemを解決することと等価ですが、finalメソッドの場合、これは事実です。たとえば、いつでもfinalメソッドへの呼び出しをインラインで行うことができます。 Scala Reference manualによれば

0

最終修飾子は、クラスメンバの定義およびクラス 定義に適用されます。最終的なクラスメンバー定義は、サブクラス でオーバーライドできません。最終クラスはテンプレートによって継承されないかもしれません。 finalはオブジェクト定義のために冗長で です。最終クラスまたはオブジェクトのメンバー も暗黙的にfinalであるため、final修飾子は一般的に も冗長です。ただし、定数値 の定義(§4.1)は、 が最終クラスまたはオブジェクトで定義されていても、明示的な最終修飾子を必要とすることに注意してください。 finalは の不完全なメンバーには適用されず、封印された1つの修飾子リスト には結合できません。

コンパイラでは、パフォーマンスや利点の大幅な改善はなく、言語の制約の一部に過ぎません。

関連する問題