当构造函数在抛出异常之前部分成功时会发生什么?

时间:2011-08-02 22:06:25

标签: java exception constructor

假设我有以下基类:

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尚未运行构造函数。

如何处理这些情况?这只是一个糟糕的设计方案吗?或者这是否有点意义?在构造函数完成后,我真的不想重构整个应用程序以将子节点添加到父节点。

2 个答案:

答案 0 :(得分:2)

作为一般原则,不惜一切代价避免将“此”的价值从构造函数中泄露出来。在这种情况下,父对象将具有对半构造对象的引用。它应该在呼叫者中编码为例如parent.addChild(new Child())而不是自动添加。

答案 1 :(得分:1)

如果:

 private List<RootClass> children = new ArrayList<RootClass>();

是一个静态场,你只是将一个半初始化的物体泄漏到野外。事实并非如此,它不会有任何区别。

如果此引用泄漏到对象之外的某个位置,则只会出现问题,那么您将有一个半初始化的对象等待导致系统出现问题。只要你确保参考文献不会出现任何问题,那一切都很好。