12

日常のプログラミング (Web またはその他) でクラスまたはメソッド final を宣言する必要がある特定の理由はありますか? 使用する必要がある実際の例を提供してください。

ところで、私は「あいまいな」キーワードを選んでそれを習得しようとしているので、私は尋ねています.

4

6 に答える 6

12

これにより、他のプログラマーがあなたのクラスで意図しないことを行うのを防ぎます。したがって、「このクラスを使用して XXX を実行しないでください」というコメントを作成するのではなく、オーバーライドしてそのように悪用する誘惑に駆られないように設計できます。

編集:例が要求されているので、このキーワードが便利な場合について説明します...たとえば、リスナーとノーティファイアなど、2つのオブジェクトが互いに通信する方法を定義するクラスがあるとします。リスナー クラスは明らかに継承を許可する必要がありますが、notifier クラスを final にして、"has-a" 関係で使用する必要がある場合があります。このようにして、受信しているメッセージの性質について、リスナー オブジェクトからいくつかの仮定を立てることができます。

そうしないと、そのクラスから継承したり、メッセージを拡張したりなど、あらゆる種類のクレイジーなことを行うことができます。他のプログラマーにそれをさせたくない場合は、クラスを final にすることができます。また、これは広く使用されているパブリック API ではより理にかなっている可能性があります。これにより、他のプログラマーがどのクラスをサブクラス化してもよいかを容易に理解できるようになるからです。

別の例 - バッファベースのストリーム プロセッサがあり、read()/write() メソッド内で、オブジェクトの現在の状態に関するデータ (つまり、現在のバイトなど) を保持しているとします。このクラスをサブクラス化する人が処理中にスーパーのメソッドを呼び出すことを保証する方法はありません。また、そのようなクラスにはいくつかのメソッドしか含まれていない可能性が高いため、各メソッドではなく全体を final にすることをお勧めします。これにより、クラスを使用する人々は「is-a」ではなく「has-a」を強制されるため、コードの実行方法を制御できます。

クラス全体を final にすることは、おそらくブルームーンで一度行う必要があるという点であなたに同意しますが、PHP がこの機能を実行することを選択した場合に備えていることは素晴らしいことです。

于 2009-02-08T20:35:42.250 に答える
6

「継承よりも構成を強制する」は、かなり簡潔に述べています。次のセクションで説明するように、クラスの特定の動作を保証します。これには、次のセクションで説明するように、セキュリティ上の利点もあります。

于 2009-02-08T20:51:50.807 に答える
3

一部の人々は、特にポリモーフィックな拡張を許可するつもりがなく、その影響を調べていない限り、すべてのクラスを finalと宣言する必要があると主張しています。これは、あなたのコードで作業している他の人に対する不信感を暗示していると私は感じがちですが、残念ながら、それが正当化されることもあります。

于 2009-02-08T20:36:31.280 に答える
2

多くの言語では、クラスを final として宣言すると、メソッドの virt テーブルを調べる必要がないため、最適化の利点も得られます。

クラスの意図を強制したいが、その意図がサブクラス化に意味がない場合は、final; を使用します。そうでなければ、大きな利点はありません。

一般に、これは意図を強制するための単なるメカニズムです。

于 2009-02-08T21:00:45.043 に答える
0

最終クラスは、サブクラス化できないクラスであるため、派生物を作成したくないものはすべてです。たとえば Java では、絶対値の意味を再定義できないようにするため、Math クラスは final です。

于 2009-02-08T20:37:04.507 に答える
0

final (および c# で封印) を (クラス ライブラリの設計者が) 使用して、クラスの基本的な動作を強制することができます。
たとえば、文字列が不変の動作を持つように強制します。Java
の文字列クラスは final とマークされ、c# では seal とマークされます。
すべての文字列は不変であり、その動作は変更できません。

于 2009-02-08T20:49:09.753 に答える