难以理解 "Leaking the this reference"

Trouble Understanding "Leaking the this reference"

我是否正在阅读有关天气的信息,最好从此 SO page 的构造函数中调用 setter。我知道您不应该从构造函数中调用非最终方法。其中一个答案建议:

Constructors should be cautious about leaking this before the instance is fully initialized.

我不完全明白上面引述的意思。假设我有以下 class:

public final class Employee
{
    private String empID;
    private String empFirstName;
    private String empLastName;

    public Employee(String ID, String FirstName, String LastName)
    {
        //Call to other setters left out. 
        this.setEmployeeLastName(LastName);

    }

    //empID, empFirstName setter left out.
    public void setEmployeeLastName(String lastname)
    {
        this.empLastName = lastname;
    }
}
  1. 举个例子,在完全创建实例之前,如何泄漏 this 引用?这是否意味着在创建对象 之前将对象作为参数传递?

泄漏 this 引用可能很危险,因为看起来应该完全初始化的东西可能不会,而且这个事实很容易隐藏。这是使用子类化可能会出现问题的示例:

class Foo{
    Foo(){
        doStuff();
    }
    void doStuff(){}
}

class Bar extends Foo{
    private int i = 1;
    @Override
    public void doStuff(){
        System.out.println(i);
    }
}

你会想,在实例化 Bar 的新实例时,它会显示 1。但它显示 0,因为该方法在 Bar 的构造函数运行之前被调用,因此 i 尚未设置其值。这是泄漏 this 如何在其他方面看起来不错的代码中适得其反的一个示例。

对于你的第二个问题,在构造函数中调用 finalprivate 方法几乎总是有效的。唯一的例外是,如果您调用的方法依赖于正在初始化的某个值,并且该方法在初始化发生之前被调用。但是你的 setter 不依赖于任何状态,所以事实并非如此,并且它不能在子类中修改(因为它是最终的)所以它没有办法表现不正常。