如何回滚超类构造函数

时间:2017-07-12 17:19:53

标签: java

共有3个课程:BaseDerivedRegistry

class Base {
  Base() {
    Registry.register(this);
  }
}

class Derived extends Base {
  Derived() {
    // throws an exception here
  }
}

Registry构造函数抛出异常时,有没有办法从Derived取消注册半构造对象?

我知道这是一种反模式,因为this在构造函数中使用。我正在寻找更好的设计,例如Base.listInstances()

1 个答案:

答案 0 :(得分:0)

如果您有取消注册方法,可以这样做。

class Base {
    Base() {
        Registry.register(this);
    }
}

class Derived extends Base {
    super();
    try {
        // do stuff
    } catch (Exception e) {
        Registry.unregister(this);
        throw e;
    }
}

如果不是,您只应在成功创建Object时注册它(如果允许,则必须修改Base)。