Whi*_*red 2 java logic constructor this
警告:在构造函数中泄漏"this"
我一直在努力,我有一种唠叨的感觉,因为我的设计是错误的或不是最佳的.
我知道这个警告引起了我的注意,我允许访问可能未完全初始化的对象.
假设我需要一个具有HAS并且需要List(Frame(List list))的Frame.在List中,我可能想要做一些事情,比如add().为了确保Frame尽可能少地了解List(只有它有一个),我想从列表中访问包含的Frame(List HAS a Frame?).这看起来有点傻,但我有2个以上的List实现,它们将以不同的方式使用Frame.
为了确保我的代码正确使用,我需要在List的构造函数中使用Frame.我还需要在Frame的构造函数中使用List,因为它必须有一个:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
那么,这是一个糟糕的设计,还是我真的应该创建一些这样做的中间脚手架,甚至将脚手架留给用户?
谢谢!
介绍一种工厂方法:
public static Frame createFrame(List list) {
Frame frame = new Frame(list);
list.setFrame(frame);
}
private Frame(List list) {
this.list = list;
}
Run Code Online (Sandbox Code Playgroud)
这不会泄漏这一点,并且始终确保一切都正确配置,而不需要每个调用者都记住初始化关联的两面.