Java 当构造函数在引发异常之前部分成功时会发生什么?
假设我有以下基类:Java 当构造函数在引发异常之前部分成功时会发生什么?,java,exception,constructor,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(RootClas
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);
}
}
现在,假设我创建了一个ChildClass
实例,该实例抛出异常,但在构造函数之外被捕获(在代码深处的某个地方,到目前为止,它不知道ChildClass
尚未完全构造)。现在,父级在其子级
列表中有一个对子类
的引用,该类尚未运行其构造函数
这些情况应如何处理?这只是一个糟糕的设计方案吗?或者这一点意义都没有?我真的不想重构整个应用程序,在构造函数完成后将子应用程序添加到父应用程序中。如果:
private List<RootClass> children = new ArrayList<RootClass>();
private List children=new ArrayList();
如果是一个静态字段,您只会将一个半初始化的对象泄漏到野外。事实并非如此,这不会有任何区别
只有当这个引用泄漏到对象之外的某个地方时,您才会有问题,然后您就会有一个半初始化的对象等待在您的系统上引起问题。只要您确保引用本身不出任何地方,一切都是好的。作为一般原则,要不惜一切代价避免将“this”的值泄露给构造函数。在这种情况下,父对象将具有对半构造对象的引用。它应该在调用者中编码为parent.addChild(new Child()),而不是自动添加。可能重复“可能”重复的含义是什么?这类问题需要更多VoteNo,他泄漏了它,因为父级是合法的且已经存在的实例,现在有一个关于孩子们的参考。我想知道这个模式是否有有效的用法。或者更确切地说,java允许编译这种代码是有原因的吗?@Pacerier编译器的存在不是为了防止您编写不安全的代码,只是为了防止您编写+不正确的+代码。如果没有这种代码的有效用例,它也可能被认为是“不正确的”@Pacerier没有人说没有有效的用例。您仍然在混淆编译器的功能和语言规范。@Pacier一次可能会混淆不止一件事:-|
private List<RootClass> children = new ArrayList<RootClass>();