我有一个这样的类:
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;
}
}
所有版本都不安全;它们都是"让CCD_ 1逃逸"的情况。
考虑创建一个工厂方法,在构建完成后创建工人助手,例如:
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;
}
}