是仅在继承中还是在大多数情况下都是如此?
public class MyClass {
public int id;
public MyClass() {
// Some stuff
setId(5);
}
public setId(int id) {
this.id = id;
}
}
最佳答案
这是非常真实的。
因为 setter 始终是 public
方法。如果你的类不是 final
那么就会有外来方法调用的问题。这不是线程安全的,即它被称为转义 this
引用。因此,从构造函数调用方法时,它应该是 final
或 private
。否则对象的安全初始化
将不会发生,这会导致实际系统中的许多错误。
除上述之外,我们永远不应该从构造函数
调用public
方法,因为如果该类用于继承,则构造函数不得直接调用可重写的方法或间接。
如果违反了这条规则,就会导致程序失败。父类(super class)构造函数在子类构造函数之前运行,因此子类中的覆盖方法将在子类构造函数运行之前被调用。如果覆盖方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期运行。
source .
关于java - 为什么从构造函数调用 Set 方法不是一个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116597/