假设我有以下基类:
public class RootClass {
private List<RootClass> children = new ArrayList<RootClass>();
public RootClass(RootClass parent) {
if (parent != null) {
parent.addChild(this);
}
}
public void addChild(RootClass child) {
children.add(child);
}
}
我有以下儿童班:
public class ChildClass extends RootClass {
public ChildClass(RootClass parent) {
super(parent);
doInitialization();
}
private void doInitialization() {
//Might throw an unchecked exception
}
}
现在,假设我创建了一个抛出异常的ChildClass
实例,但是在构造函数之外被捕获(在代码深处的某个地方,到目前为止,它不知道{{ 1}}尚未完全构建)。现在,父级在其ChildClass
列表中有一个引用,但children
尚未运行构造函数。
如何处理这些情况?这只是一个糟糕的设计方案吗?或者这是否有点意义?在构造函数完成后,我真的不想重构整个应用程序以将子节点添加到父节点。
答案 0 :(得分:2)
作为一般原则,不惜一切代价避免将“此”的价值从构造函数中泄露出来。在这种情况下,父对象将具有对半构造对象的引用。它应该在呼叫者中编码为例如parent.addChild(new Child())而不是自动添加。
答案 1 :(得分:1)
如果:
private List<RootClass> children = new ArrayList<RootClass>();
是一个静态场,你只是将一个半初始化的物体泄漏到野外。事实并非如此,它不会有任何区别。
如果此引用泄漏到对象之外的某个位置,则只会出现问题,那么您将有一个半初始化的对象等待导致系统出现问题。只要你确保参考文献不会出现任何问题,那一切都很好。