0

オブジェクト作成のための「静的ファクトリメソッドとコンストラクター」が議論されている効果的なJava項目1を調べていました。言及されている欠点の1つは次のとおりです。

「静的ファクトリ メソッドのみを提供することの主な欠点は、パブリックまたは保護されたコンストラクターを持たないクラスをサブクラス化できないことです。」

オブジェクト合成を継承に促進するので、これは良いとも言われています。しかし、どうしても継承が必要な場合、それは深刻な制限ではありませんか? クラスが拡張されるかどうか以前からわからないのに、オブジェクトの作成に静的ファクトリ メソッドを使用する必要があるのはなぜですか?

4

2 に答える 2

1

クラスが拡張されるかどうか以前からわからないのに、オブジェクトの作成に静的ファクトリ メソッドを優先する必要があるのはなぜですか?

この質問に対する答えは、Effective Java Item 17: Design and Document for Inheritance or else Prohibit It にあります。継承用のクラスを設計するには、次のようなかなり多くの作業が必要です。

  1. メソッドをオーバーライドした場合の影響を正確に文書化します。
  2. フック メソッドの提供。
  3. サブクラスのテスト (それらのクラスを自分で実装することによる)。
  4. コンストラクターを制限して、オーバーライド可能なすべてのメソッドを回避します。
  5. CloneableインターフェイスとSerializableインターフェイス、および継承への影響を考慮します。

この作業をすべて行った場合、静的ファクトリ メソッドだけを提供することはありません。また、パブリックまたは保護されたコンストラクターを少なくとも 1 つ提供します。

効果的な Java は、これらの各ポイントについて詳しく説明しますが、最終的なアドバイスは次のとおりです。

この問題の最善の解決策は、安全にサブクラス化できるように設計および文書化されていないクラスでのサブクラス化を禁止することです。

于 2016-12-14T13:53:21.990 に答える
0

引用は次のとおりです。

静的ファクトリ メソッドのみを提供することの主な欠点は、パブリック コンストラクターまたはプロテクト コンストラクターを持たないクラスをサブクラス化できないことです。

静的ファクトリではなく、静的ファクトリ メソッドのみを提供することの違いを感じます。

「まあ、今はよくわからないかもしれませんが、念のため拡張可能のままにします」ではなく、拡張用に設計する必要があります。

クラスが拡張可能な場合、少なくとも public コンストラクターが必要です。この場合、静的ファクトリ メソッドのみを提供できます。しかし、私はそれを深刻な制限とは呼びません。

于 2016-12-13T17:00:15.153 に答える