请勿从构造函数中调用过多的方法。
引用 有效Java 2nd Edition,条款17:继承的设计和文档,或者禁止它 :
类必须遵守一些其他限制以允许继承。 构造函数不得 直接或间接 调用可重写的方法
。如果违反此规则,将导致程序失败。超类构造函数在子类构造函数之前运行,因此子类中的重写方法将在子类构造函数运行之前被调用。如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将无法正常工作。
这是一个示例说明:
public class ConstructorCallsOverride { public static void main(String[] args) { abstract class base { base() { overrideMe(); } abstract void overrideMe(); } class Child extends base { final int x; Child(int x) { this.x = x; } @Override void overrideMe() { System.out.println(x); } } new Child(42); // prints "0" }}在此,当
base构造函数调用时
overrideMe,
Child尚未完成对的初始化
final intx,并且该方法获得了错误的值。这几乎肯定会导致错误和错误。
也可以看看
- FindBugs-从超类的构造函数调用的未初始化的字段方法读取



