假设我有两个这样的课程
public class Foo
{
protected final Bar child;
public Foo()
{
child = new Bar(this);
}
}
public class Bar
{
protected final Foo parent;
public Bar(Foo parent)
{
this.parent = parent;
}
}
我想创建一个 , 的子类Foo
,Foo2
它的子类 aBar2
是 的子类Bar
。我可以这样做:
public class Foo
{
protected final Bar child;
public Foo()
{
child = new makeChild();
}
protected Bar makeChild()
{
return new Bar(this);
}
}
public class Foo2 extends Foo
{
@Override
protected Bar makeChild()
{
return new Bar2(this);
}
}
但是,这应该是一个非常糟糕的主意。但是这样的事情是行不通的:
public class Foo
{
protected final Bar child;
public Foo()
{
this(new Bar(this));
}
protected Foo(Bar child)
{
this.child = child;
}
}
因为在调用超类型构造函数之前new Bar(this)
引用。this
我看到了两种处理方法:
1)我可以将成员设为私有和非最终成员,然后让设置器在它们已经设置时抛出异常,但这看起来很笨拙,只能在运行时检测到任何编码问题。
2)我使Foo
构造函数将要使用Class
的类型的对象作为参数Bar
,然后使用反射来调用该类的构造函数。但是,对于我正在尝试做的事情来说,这似乎是重量级的。
我缺少任何编码技术或设计模式吗?