【问题标题】:Protected vs Public in terms of Inheritance in Java [duplicate]在Java中的继承方面受保护与公共[重复]
【发布时间】:2015-05-16 13:09:09
【问题描述】:

在创建超类时应该在 Java 中何时使用 Public 而不是 Protected,如果程序运行时使用 Protected 访问修饰符集没有任何问题,是否需要将其更改为 Public?

【问题讨论】:

    标签: java


    【解决方案1】:

    您应该关注Principle of Least Privilege

    这意味着应为成员分配程序运行所需的最低可访问性。

    如果不相关的类需要访问,请将其设为public。通常,这仅适用于提供对数据的托管访问的方法。

    如果要完全信任子类来操作数据,并且需要它正常工作,则可以将成员设为protected

    否则,将其设为private,因此没有其他类可以访问它(无需通过其他更易于访问的方法来帮助封装数据)。

    如果你的程序在protected 时运行良好,那么不要让它成为public。考虑将其设为private,并使用访问它的protected 方法,以更好地封装数据。

    【讨论】:

    • “应该为成员分配程序运行所需的最低可访问性” 我认为可能会产生误导。这有点暗示,如果程序通过公开一个字段来工作,它应该被公开。如果一个不相关的类需要访问一些私有数据,重新考虑你的抽象!
    【解决方案2】:

    回忆一下那些访问修饰符在做什么。

    public 字段是任何使用此类的类都可以修改的字段。

    protected 字段是类、其子类以及同一包中的类可以访问的字段。

    更改这些字段的可见性涉及更大的风险,具体取决于您的数据所封装的内容。我强烈反对这种声明。

    【讨论】:

    • 不是 100% 精确的。受保护的字段是只有该类、它的子类、和同一包中的类才能访问的字段,如果我没记错的话。
    • 好收获。我已经更新了答案。
    【解决方案3】:

    仅当您希望您的变量或方法被该超类的子类访问或覆盖但您不希望该变量或方法在超类或子类之外(即公开)访问时,才在超类中使用protected。

    当您希望任何类都可以访问您的变量或方法时,请使用 public。请注意,您应该很少有公共的非最终变量或公共可变变量。

    如果程序在受保护的访问权限下运行时没有任何问题 modifier set 有必要改成Public吗?

    不,对变量和方法使用最不易于访问的访问修饰符。因此,如果它们不需要公开,请不要将它们公开,并且仅在需要保护它们时才使它们受保护(即子类需要)。否则将它们设为私有。

    有关这背后的原因,请参阅 Joshua Bloch 撰写的 Effective Java 中的“第 13 项:最小化类和成员的可访问性”部分:http://uet.vnu.edu.vn/~chauttm/e-books/java/Effective.Java.2nd.Edition.May.2008.3000th.Release.pdf

    【讨论】:

      猜你喜欢
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2016-09-04
      • 2016-01-01
      • 2012-02-13
      • 2019-08-24
      • 2011-01-17
      相关资源
      最近更新 更多