为什么从构造函数调用Set方法不是一个好主意?

use*_*609 4 java inheritance

仅在继承或大多数情况下是真的吗?

public class MyClass {
   public int id;

     public MyClass() {
         // Some stuff 
         setId(5);
     }

     public setId(int id) {
         this.id = id;
     }
}
Run Code Online (Sandbox Code Playgroud)

Try*_*ing 6

这是真的.

因为setter总是public方法.如果你上课不是final那么有外来方法调用的问题.这不是线程安全的,即它被称为逃避this引用.所以从构造函数中,如果你调用一个方法,它应该是finalprivate.否则safe initialization对象就不会发生这会导致在实际系统中的许多错误.

除了上面的内容之外,我们永远不应该public从中调用方法,constructor因为如果类用于继承,那么构造函数不能直接或间接地调用可覆盖的方法.

如果违反此规则,将导致程序失败.超类构造函数在子类构造函数之前运行,因此在子类构造函数运行之前将调用子类中的重写方法.如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期运行.

来源.