4

私はEffective Javaを使用しています。最初の項目は、コンストラクターに対する静的ファクトリ メソッドの説得力のある事例です。

私は最初の欠点を得ませんでした

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

静的メソッドは継承できないため、静的ファクトリ メソッドを持つクラスをサブクラス化する必要があるのはなぜですか?

誰か説明してくれませんか。

4

5 に答える 5

2

サブクラスのインスタンスを作成するには、そのコンストラクターを呼び出す必要があります。

コンストラクターが最初に行う必要があるのは、その親クラスのコンストラクターの 1 つを呼び出すことです (super()明示的に追加しない場合、コンパイラーは呼び出しを挿入します)。

すべての親クラス コンストラクターがプライベートである場合、サブクラスはそれらのいずれも呼び出すことができず、親クラスは実質的に最終的なものになります。つまり、サブクラス化することはできません。

于 2013-11-01T19:16:30.580 に答える
1

いくつかの事実

  • サブクラスでは、各コンストラクターは、スーパークラス コンストラクターを呼び出すコンストラクターの開始時にsuper(..)(引数の場合もある) を呼び出す必要があります。..
  • 正しい静的ファクトリ パターンを実装するには、このパターンを持つクラスのすべてのコンストラクタは、privateファクトリ メソッドを使用せずにクラスをインスタンス化することを防ぐ必要があります。

したがって、ファクトリ メソッドを持つ基本クラスのコンストラクターはプライベートである必要があるため、派生クラスを呼び出すことができsuper(..)ず、サブクラスをコンパイルできません。

于 2013-11-01T19:35:37.380 に答える
0

クラスを作成instantiateすると、最初にそのクラスのコンストラクターbaseが呼び出されます。parentがプライベートの場合parent class constructor、クラス本体の外部から呼び出すことはできないため、機能しません。あなたが読んでいる間に、それinheritanceを使用したい場合super()は基本クラスのコンストラクターの最初の行にする必要があるという1つのポイントがあったことを思い出してください。基本クラスで明示的に使用しない場合、super()コンパイラーは自動的にそこに配置します。parent class constructorあなたがprivateの場合はどうなるか考えてみてくださいsuper()。通話は失敗します。

于 2013-11-01T19:20:33.377 に答える
0

これは、クラスが一部の継承機能をサポートしないことを意味します。たとえば、そのメソッドをオーバーライドすることはできず、これを動的ディスパッチのスーパー タイプとして使用することはできません。

于 2013-11-01T19:39:30.483 に答える