来自有效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());
}
请注意,您的第一个报价仅指文档,而不是代码。我建议唯一的问题是使用必须,而应该可能更合适。