4

コンストラクターで構築されているクラスを変更する方法はありますか?

public class A {
  A() {
    //if (condition) return object of type B
    //else return A itself
  }
}
public class B extends A { }

基本的には、基本クラスのコンストラクターをファクトリメソッドとして使用したいと思います。Javaで可能ですか?

4

5 に答える 5

9

いいえ、これを行う場合は、ファクトリメソッドを使用する必要がありますAnew A()あなたのクラスのクライアントは、もしそうなら、彼らがクラスのオブジェクトを取得し、他のものを取得しないことを期待する権利を持っていますA

于 2009-10-01T04:52:00.703 に答える
5

いいえ、コンストラクターは、コンストラクターが表すクラスのオブジェクトをインスタンス化するだけです。そのため、コンストラクターで戻り値が指定されていません。

于 2009-10-01T04:47:46.063 に答える
4

コンストラクターではできませんが、次のことができます。

public class A {

private A(){ }

public static A getInstance(){
     if (condition) 
        return new B();
     else 
        return new A();
}

}

class B extends A {

}
于 2009-10-01T08:38:50.997 に答える
3

コンストラクターコードが呼び出されているとき、オブジェクトはすでに作成されています。フィールドを初期化するだけです。したがって、オブジェクトのクラスを変更するには遅すぎます。

于 2009-10-01T10:04:30.323 に答える
1

リフレクションを使用してサブクラスをインスタンス化することができます。ただし、クラスはそのサブクラスについて知る必要がないため、これは悪い考えです。

あなたの場合、ファクトリメソッドを使用するのが最善の方法です。

于 2009-10-01T08:23:11.353 に答える