在对象构造期间调用的PMD可重写方法

Use*_*ser 11 java pmd

我有以下结构

public class parent {
    int value ; 
}

public class child extends parent {
    int childValue;
    public child(){}
    public child (int value){
          this.childValue = value ; // this line cause ConstructorCallsOverridableMethod warning during object construction
    }
}
Run Code Online (Sandbox Code Playgroud)

你能建议如何解决这个错误吗?

Pau*_*gas 16

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

删除构造函数中对可覆盖方法的任何调用,或将final修改器添加到该方法.