に基づいてスーパータイプのメンバーを初期化します。は、私は次のような状況を持っている亜型情報
public abstract class A {
private Object superMember;
public A() {
superMember = initializeSuperMember();
// some additional checks and stuff based on the initialization of superMember (***)
}
protected abstract Object initializeSuperMember();
}
class B extends A {
private Object subMember;
public B(Object subMember) {
super();
subMember = subMember;
}
protected Object initializeSuperMember() {
// doesn't matter what method is called on subMember, just that there is an access on it
return subMember.get(); // => NPE
}
}
問題は、私は新しいオブジェクトBの作成上のNPEを得ることです。
サブクラスのコンストラクタでsubMemberコンテンツを割り当てた後でinitializeSuperMember()を呼び出すことでこれを回避できますが、サブクラスごとにこれを行う必要があることを意味します(*)。
そして、スーパークラスのコンストラクタでsuper()を呼び出す必要があるので、super()の呼び出しの前にsubMemberを初期化することはできません。私はalltogether間違って何かをしようとしていた場合
誰でもケアこれを行うには良い方法があるなら、私に教えたりするには?
は、それでは、唯一の解決策は、すべてのサブクラスでは、いくつかの重複したコードを持っているのですか? – Deelazee
他のスレッドへの参照ありがとう。 – Deelazee
@Deelazee - それは唯一の解決策ではありません。私が参照したスレッドで説明したように、[Builderパターン](http://en.wikipedia.org/wiki/Builder_pattern)を使用することができます。密接に関連している[ファクトリメソッドパターン](http://en.wikipedia.org/wiki/Factory_pattern)を使用することもできます。 –