在规划继承时,是否允许构造函数调用可重写方法



来自有效Java第二版,第17项:

对于每个公共或受保护的方法或构造函数,文档必须指明该方法或构造函数的哪些可重写方法调用

在同一项目的后面,它说:

构造函数不能直接或间接调用可重写的方法。

这两种说法难道不矛盾吗,还是我遗漏了什么?

在构造过程中调用可重写方法是允许的-这并不违法。

在构造期间调用可重写方法是不建议的-在构造期间通常不建议调用可重写的方法,因为这会导致不完整的对象被暴露,并限制系统的可预测性。

public class A {
    final int a;
    public A() {
        a = method();
    }
    protected int method() {
        return 42;
    }
    @Override
    public String toString() {
        return "A{" + "a=" + a + '}';
    }
}
public class B extends A {
    @Override
    protected int method() {
        System.out.println("this=" + this);
        return 96;
    }
}
public void test() {
    System.out.println("B = " + new B());
}

请注意,您的第一个报价仅指文档,而不是代码。我建议唯一的问题是使用必须,而应该可能更合适。

最新更新