我有一个这样的课程:
public class WorkHelper {
private final Worker worker;
public WorkHelper(Worker worker) {
this.worker = worker;
}
//...
}
每个人都知道下面的初始化是错误的:
public class Worker {
private final WorkHelper helper;
private final SomeClass some;
public Worker(SomeClass some) {
helper = new WorkHelper(this);
this.some = some;
}
}
但是下面的那个怎么样?这是正确的吗?
public class Worker {
private final WorkHelper helper = new WorkHelper(this);
private final SomeClass some;
public Worker(SomeClass some) {
this.some = some;
}
}
答案 0 :(得分:4)
所有版本都不安全;它们都是“ letting this
escape”的情况。
考虑创建一个工厂方法,该方法在构造完成后创建辅助工人,例如:
public class Worker {
private WorkHelper helper;
private SomeClass some;
// hide the constructor
private Worker() {}
public static Worker create(SomeClass some) {
Worker worker = new Worker();
worker.some = some;
worker.helper = new WorkHelper(worker); // pass post construction
return worker;
}
}