【问题标题】:Best Practices for Implementing Setters/Getters in Subclasses?在子类中实现 Setter/Getter 的最佳实践?
【发布时间】:2017-02-17 19:59:50
【问题描述】:

如果我有一个必须保留某些功能的超类,因此需要 setter/getter(我意识到这并不理想,但这不是重点),当我实现子类时,我是否应该包含对超类的调用子类中的 setter/getter,即使我可以在技术上调用它们而无需再次编写代码?

我在下面发布了一个示例。

class Parent {

   private int x;

   public void myMethod() {
      // Code here.
   }

   public void setX(int y) {
       x = y;
   }

   public int getX() {
       return x;
   }


}

class Child extends Parent {

   @Override 
   public void myMethod() {
      super.myMethod();
      // Different code here.
   }

   // Are the inclusions below really necessary? 
   public void setX(int y) {
       super.setX(y);
   }

   public int getX() {
       super.getX();
   }
}

【问题讨论】:

    标签: java inheritance methods getter-setter


    【解决方案1】:

    继承的全部意义在于,如果超类方法满足您的需要,则不必在子类中重新实现方法。只有当子类方法需要做一些不同/更多的事情时,你才应该重写。

    【讨论】:

      【解决方案2】:

      我是否应该在子类中包含对超类的 setter/getter 的调用

      首先,如果您希望孩子可以访问private int x,请将私有更改为受保护。

      我能想到何时返回/设置不同数据的唯一原因是,例如,子类在设置x 之前对y 进行了一些额外的计算。否则,如果您只是委托给 super 方法,那么该定义是不必要的。

      【讨论】:

        【解决方案3】:

        如果您需要专门访问父对象的私有字段,请使用超类访问器。如果您在子类中定义了不同的实例字段,则需要单独的 getter 来访问这些字段/变量。

        否则,只需使用预定义的超方法,所有扩展父类的类都继承这些方法。

        【讨论】:

          【解决方案4】:

          仅调用其超级版本的覆盖方法是您默认获得的,无需覆盖!

          换句话说:

          @Override
          void foo() { super.foo(); }
          

          结果绝对与...的行为相同,根本不覆盖该方法。

          因此,相反:您应该考虑将这些 getter 和 setter 设为 final 以防止子类覆盖它们!并且记录一下:当覆盖方法时,您总是希望将 @Override 注释放在这些方法上(这样编译器就可以告诉您何时只认为您正在覆盖一个方法)。

          【讨论】:

          • 感谢采纳;我不再期待了。我用更多信息更新了我的答案;和旁注:鉴于您对“继承”的理解不正确;也许你退后一步是有意义的——也许你认为基类上的“我需要 getter/setter”方法也可能是错误的。拥有 getter 并不好,但允许使用 setter 是我们应该尽量避免的事情!
          • 我正在完成一个练习,其中说明我应该同时使用 getter 和 setter 方法。不幸的是,我读过的一些教学材料更关注教学功能而不是最佳实践,这让我感到困惑。但是,您的回答很清楚。
          猜你喜欢
          • 2014-11-18
          • 1970-01-01
          • 1970-01-01
          • 2020-05-20
          • 1970-01-01
          • 1970-01-01
          • 2018-05-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多