【问题标题】:Java - protected 'getters' vs. nested classesJava - 受保护的“getter”与嵌套类
【发布时间】:2013-03-31 12:59:43
【问题描述】:

如果我在父类中有一堆字段都需要由子类继承,那么将子类嵌套在超类中,使字段受保护而不是私有,还是使用受保护的访问器更好?还是其他替代方案?

【问题讨论】:

  • 由于这在很大程度上取决于您的用例,您能否详细说明一下?
  • 我有一个超类(员工),它包含许多子类(员工类型)通用的数据,以及一些工资/税收计算方法(抽象和具体)。子类进行大量计算,需要来自超类中的字段的数据。很少有字段需要从这个类家族之外访问。

标签: java inheritance field protected nested-class


【解决方案1】:

最简单的解决方案是保护超类字段或实例变量,但是,如果您将它们设为私有,则始终可以通过 getter 和 setter 访问它们,这在概念上要好得多,因为它遵循封装原则。

【讨论】:

    【解决方案2】:

    最简单的解决方案似乎是使字段受到保护,除非您有令人信服的理由不这样做,否则就这样做。

    【讨论】:

      【解决方案3】:

      我认为使用受保护的访问器是最好的和更常见的方法。

      【讨论】:

        【解决方案4】:

        在某些情况下,公开受保护的字段或受保护的访问器方法是有意义的。所以这一切都取决于您对父类的设计,以及您希望子类如何利用您的父类。

        但是,可以肯定的是:“将子类嵌套在超类中会更好吗?”

        【讨论】:

          【解决方案5】:

          如果您希望子类可以访问它,则只剩下两个选项,公共和受保护。受保护的可能是您想要的。当您在 java 中使用 extends 关键字进行继承时,下表适用。

                         Access Levels
          
          Modifier    Class   Package Subclass    World
          public      Y       Y       Y           Y
          protected   Y       Y       Y           N
          no modifier Y       Y       N           N
          private     Y       N       N           N
          

          如果你在超类中嵌套子类,那么你也可以使用私有。这是因为内部类是父类的一部分,因此也可以访问私有方法。

          public class Parent {
              private int x = 5;
          
              //Not really a subclass
              private class NestedClass {
                  public NestedClass() {
                      int hax = new Parent().x; // Works!
                  }
              }
          
              //More of a nestedclass than a subclass.
              private class SubClass extends Parent {
                  public SubClass() {
                      int stillHax = new Parent().x;
                  }
              }
          }
          

          在使用 extendsimplements 关键字之前,您不会使用继承,因此您可能希望让 SubClass 扩展 Parent 类(在不同的文件中)并且变量将受到保护(或公共)级别访问。请注意,在同一个包中或在同一个类中需要优先考虑网格。上述两个示例之所以有效,是因为 SAME 类中的另一个类与父类相同。

          只要按照网格走就行了。

          【讨论】:

            猜你喜欢
            • 2011-01-17
            • 1970-01-01
            • 2022-11-16
            • 2012-08-19
            • 1970-01-01
            • 2013-01-23
            • 2015-07-16
            • 2016-03-11
            • 2016-05-22
            相关资源
            最近更新 更多