【问题标题】:Warning: Overridable method call in constructor...for getters? [duplicate]警告:构造函数中的可覆盖方法调用......对于getter? [复制]
【发布时间】:2012-04-08 18:28:04
【问题描述】:

Netbeans 给了我很多关于

的警告

构造函数中的所有可重写方法

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

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

【问题讨论】:

    标签: java


    【解决方案1】:

    不,尤其是 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 不会返回正确的值。

    除此之外,您究竟为什么要覆盖 getter?

    【讨论】:

    • 我没有覆盖它们,只是 Netbeans 在侧边栏中警告它们是可覆盖的。
    • 如果你没有覆盖它们(并且不打算)让它们final
    【解决方案2】:

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

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

    【讨论】:

    • 我得到它们是因为我实际上是在对它们设置属性,例如。我需要使用 this.getMyLabel().setText() 在 JLabel 中设置文本
    • 教程中的引用 - docs.oracle.com/javase/tutorial/java/javaOO/initial.html - “通常,您会将代码用于初始化构造函数中的实例变量。”如果您遵循正常程序,您将拥有所有实例变量的句柄,而无需 getter 方法。
    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2014-08-22
    • 2014-05-22
    • 2011-03-25
    • 2014-01-18
    相关资源
    最近更新 更多