クラスをファイナルにする時期に関する一般的なガイドラインはありますか?
クラスを延長したくない場合だと思っていましたが、それは少し….ナイーブ??
クラスを final にすると、お気づきのようにクラスが拡張されるのを防ぐだけです。なぜそれをしたいのですか?
典型的な使用例の 1 つは、不変性を保証することです。不変クラスを設計しても最終クラスにしない場合は、変更可能な方法で拡張できます。これにより、サブクラスがクラスの不変条件を破壊したり、並行性の問題を引き起こしたりする可能性があります。
クラスが拡張されるように設計されていないという事実を文書化するために、単純にクラスを final としてマークすることもできます。たとえば、Effective Java #17: 「継承のために設計および文書化するか、それ以外の場合は禁止する」を参照してください。
理想的には、Josh Bloch を読んで、継承が完全に機能するようにクラスを設計している必要があります。しかし、実際には、クラスを最終的にすることに対する私の(IMHO)答えは
他の人がそれを拡張することを信頼しますか (または望んでいますか)?
それが超重要なクラスString
やセキュリティ関連のクラスである場合、はい、間違いなく最終版にします。
本当に手の込んだことを行っていて、クラスを適切に拡張するのが難しい場合は、クラスを使用する人に期待するスキルに応じて、クラスを最終的なものにすることを検討してください。また、これが汎用ライブラリであるか、企業/プロジェクト固有のコードであるか、および Squirrel ビデオまたは心臓ペースメーカーを含む Web サイト用であるかどうかによっても異なります。
それほど派手なことをしていない場合は、それを最終的なものにしてユーザーを困らせないでください。Double
Java をfinalのようなクラスにすることで、私はしばしば Java をののしりました。
継承がカプセル化を破ることは十分に確立されています。Allan Snyderは、彼の論文の中で、オブジェクト指向プログラミング言語でのカプセル化と継承は、継承で実行しなければならない注意を示しています。
JosuaBlochは彼の著書EffectiveJavaで、継承するクラスを設計および文書化することを推奨しています。そうでない場合は、Snyderにすでに知られている問題を正確に参照して、継承を禁止します。
ある時点でクラスを将来どのように拡張できるかわからない場合、または実際にクラスを拡張する意図がまったくない場合は、クラスを最終的にする方がよいでしょう。後でいつでも拡張のためにそれらを開くことができますが、状況によっては不可能ではないにしても、逆に(とりわけオープンシステムを構築している場合)、痛みの本当の原因になる可能性があります。
MikhajlovとSekerinskiの論文「AStudyofthe Fragile Base Class」の研究は、継承を不適切に使用した場合に発生する可能性のある一連の問題を示しており、これがなぜ重要であるかについてより広い考えを与える可能性があります。