难以理解 "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;
}
}
- 举个例子,在完全创建实例之前,如何泄漏 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
如何在其他方面看起来不错的代码中适得其反的一个示例。
对于你的第二个问题,在构造函数中调用 final
或 private
方法几乎总是有效的。唯一的例外是,如果您调用的方法依赖于正在初始化的某个值,并且该方法在初始化发生之前被调用。但是你的 setter 不依赖于任何状态,所以事实并非如此,并且它不能在子类中修改(因为它是最终的)所以它没有办法表现不正常。
我是否正在阅读有关天气的信息,最好从此 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;
}
}
- 举个例子,在完全创建实例之前,如何泄漏 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
如何在其他方面看起来不错的代码中适得其反的一个示例。
对于你的第二个问题,在构造函数中调用 final
或 private
方法几乎总是有效的。唯一的例外是,如果您调用的方法依赖于正在初始化的某个值,并且该方法在初始化发生之前被调用。但是你的 setter 不依赖于任何状态,所以事实并非如此,并且它不能在子类中修改(因为它是最终的)所以它没有办法表现不正常。