PMD规则说:
在构造期间调用可覆盖的方法会带来在不完整构造的对象上调用方法的风险,并且可能难以调试。它可能使子类无法构造其超类或被迫在其内部完全复制构造过程,从而失去调用的能力super()
。如果默认构造函数包含对可重写方法的调用,则子类可能完全无法实例化。请注意,这包括整个控制流图中的方法调用——即,如果构造函数Foo()
调用了bar()
调用公共方法的私有方法buz()
,则表示存在问题。
例子:
public class SeniorClass {
public SeniorClass(){
toString(); //may throw NullPointerException if overridden
}
public String toString(){
return "IAmSeniorClass";
}
}
public class JuniorClass extends SeniorClass {
private String name;
public JuniorClass(){
super(); //Automatic call leads to NullPointerException
name = "JuniorClass";
}
public String toString(){
return name.toUpperCase();
}
}
解决方案
删除对构造函数中可覆盖方法的任何调用或将final
修饰符添加到该方法。