这种初始化安全吗?

时间:2020-03-04 16:29:44

标签: java

我有一个这样的课程:

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;
    }

}

1 个答案:

答案 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;
    }
}