私はEffective Javaを使用しています。最初の項目は、コンストラクターに対する静的ファクトリ メソッドの説得力のある事例です。
私は最初の欠点を得ませんでした
静的ファクトリ メソッドのみを提供することの主な欠点は、パブリック コンストラクターまたはプロテクト コンストラクターを持たないクラスをサブクラス化できないことです。
静的メソッドは継承できないため、静的ファクトリ メソッドを持つクラスをサブクラス化する必要があるのはなぜですか?
誰か説明してくれませんか。
私はEffective Javaを使用しています。最初の項目は、コンストラクターに対する静的ファクトリ メソッドの説得力のある事例です。
私は最初の欠点を得ませんでした
静的ファクトリ メソッドのみを提供することの主な欠点は、パブリック コンストラクターまたはプロテクト コンストラクターを持たないクラスをサブクラス化できないことです。
静的メソッドは継承できないため、静的ファクトリ メソッドを持つクラスをサブクラス化する必要があるのはなぜですか?
誰か説明してくれませんか。
サブクラスのインスタンスを作成するには、そのコンストラクターを呼び出す必要があります。
コンストラクターが最初に行う必要があるのは、その親クラスのコンストラクターの 1 つを呼び出すことです (super()
明示的に追加しない場合、コンパイラーは呼び出しを挿入します)。
すべての親クラス コンストラクターがプライベートである場合、サブクラスはそれらのいずれも呼び出すことができず、親クラスは実質的に最終的なものになります。つまり、サブクラス化することはできません。
いくつかの事実
super(..)
(引数の場合もある) を呼び出す必要があります。..
private
ファクトリ メソッドを使用せずにクラスをインスタンス化することを防ぐ必要があります。したがって、ファクトリ メソッドを持つ基本クラスのコンストラクターはプライベートである必要があるため、派生クラスを呼び出すことができsuper(..)
ず、サブクラスをコンパイルできません。
クラスを作成instantiate
すると、最初にそのクラスのコンストラクターbase
が呼び出されます。parent
がプライベートの場合parent class constructor
、クラス本体の外部から呼び出すことはできないため、機能しません。あなたが読んでいる間に、それinheritance
を使用したい場合super()
は基本クラスのコンストラクターの最初の行にする必要があるという1つのポイントがあったことを思い出してください。基本クラスで明示的に使用しない場合、super()
コンパイラーは自動的にそこに配置します。parent class constructor
あなたがprivate
の場合はどうなるか考えてみてくださいsuper()
。通話は失敗します。
これは、クラスが一部の継承機能をサポートしないことを意味します。たとえば、そのメソッドをオーバーライドすることはできず、これを動的ディスパッチのスーパー タイプとして使用することはできません。