11

我有以下结构

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
    }
}

您能否建议如何解决此错误?

4

2 回答 2

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();
  }
}

解决方案

删除对构造函数中可覆盖方法的任何调用或将final修饰符添加到该方法。

于 2013-10-21T21:14:07.280 回答
2

也许您可以遵循 Java 的命名约定并创建Child课程final

public final class Child extends Parent {
于 2013-10-21T21:04:12.247 回答