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

时间:2013-10-21 20:48:53

标签: 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
    }
}

请问您如何解决此错误?

2 个答案:

答案 0 :(得分:15)

PMD rule说:

  

在构造期间调用可覆盖的方法会导致在未完全构造的对象上调用方法的风险,并且可能难以调试。它可能使子类无法构造其超类或被迫完全复制构造过程本身,失去调用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修饰符添加到该方法中。

答案 1 :(得分:1)

也许您可以按照Java的命名约定进行操作,并制作Child课程final

public final class Child extends Parent {