Warning: Leaking "this" in constructor
我一直遇到这个问题,我有一种挥之不去的感觉,因为我的设计是错误的或不是最优的。
我知道这个警告让我注意到我允许访问可能未完全初始化的对象这一事实。
假设我需要一个框架,它有一个列表(框架(列表列表))。在 List 中,我可能想做一些诸如 add() 之类的事情。为了确保 Frame 尽可能少地了解 List(只有它有一个),我想从 List 访问包含的 Frame(List HAS a Frame?)。这看起来有点傻,但我有 2 个以上的 List 实现,它们将以不同的方式使用 Frame ..
为确保正确使用我的代码,我需要在 List 的构造函数中使用一个 Frame。 我还需要在 Frame 的构造函数中有一个列表,因为它必须有一个:
public abstract class Frame {
private final List list;
public Frame(List list) {
this.list = list;
list.setFrame(this);
}
}
public abstract class List {
private Frame frame;
protected final void setFrame(Frame frame) {
this.frame = frame;
}
}
那么,这是糟糕的设计,还是我真的应该创建一些中间脚手架来执行此操作,或者甚至将脚手架留给用户?
谢谢!
最佳答案
引入一个工厂方法:
public static Frame createFrame(List list) {
Frame frame = new Frame(list);
list.setFrame(frame);
}
private Frame(List list) {
this.list = list;
}
这不会泄漏 this,并且始终确保一切都正确配置,而不需要每个调用者记住初始化关联的双方。
关于java - 从设计的角度来看 "Leaking this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234695/