警告:构造函数中的可覆盖方法调用...对于getter?

时间:2012-03-24 13:07:39

标签: java

Netbeans给了我很多关于

的警告
  

构造函数中的可覆盖方法

我已经了解了为什么不建议在构造函数中进行可覆盖的方法调用。但是我目前在构造函数中使用的方法纯粹是类成员的getter。

所以在这种情况下,当覆盖方法纯粹是getter时,将它们放在构造函数中是否可以?在我看来,我没有太多的选择,我需要在构造函数中初始化这些变量。我可以创建一个像CustomInitComponents这样的私有方法,将我的变量设置代码放入其中并从构造函数中调用它......这会被认为是更好的实践吗?

2 个答案:

答案 0 :(得分:2)

他们是吸毒者还是二传手?因为在你的问题的最后你写的是“初始化这些变量”,而不是检索它们的值。

在任何情况下,您都可以直接设置和获取它们(derived.x = ...... = derived.x),或者您可以使用超级构造函数来初始化它们,而无需关心调用重写方法。

答案 1 :(得分:2)

不,尤其是getter可能会在构造函数中引起问题,因为它们返回的字段可能尚未初始化。

示例:

abstract class A {
  public A() {
    System.out.println(getName());
  }

  public abstract String getName();
}

class B extends A {
  private String name;

  public B (String n) {
    name = n;
  }

  @Override
  public String getName() {
    return name;
  }
}

在这种情况下,A的构造函数将首先运行并调用getName()。但是,由于B的构造函数尚未执行,因此字段name仍将为null,因此getter将不会返回正确的值。

除此之外,你为什么要重写吸气剂?