コンストラクターで構築されているクラスを変更する方法はありますか?
public class A {
A() {
//if (condition) return object of type B
//else return A itself
}
}
public class B extends A { }
基本的には、基本クラスのコンストラクターをファクトリメソッドとして使用したいと思います。Javaで可能ですか?
いいえ、これを行う場合は、ファクトリメソッドを使用する必要がありますA
。new A()
あなたのクラスのクライアントは、もしそうなら、彼らがクラスのオブジェクトを取得し、他のものを取得しないことを期待する権利を持っていますA
。
いいえ、コンストラクターは、コンストラクターが表すクラスのオブジェクトをインスタンス化するだけです。そのため、コンストラクターで戻り値が指定されていません。
コンストラクターではできませんが、次のことができます。
public class A {
private A(){ }
public static A getInstance(){
if (condition)
return new B();
else
return new A();
}
}
class B extends A {
}
コンストラクターコードが呼び出されているとき、オブジェクトはすでに作成されています。フィールドを初期化するだけです。したがって、オブジェクトのクラスを変更するには遅すぎます。
リフレクションを使用してサブクラスをインスタンス化することができます。ただし、クラスはそのサブクラスについて知る必要がないため、これは悪い考えです。
あなたの場合、ファクトリメソッドを使用するのが最善の方法です。