【问题标题】:Java: When NOT to use `private`Java:何时不使用`private`
【发布时间】:2013-03-10 20:36:43
【问题描述】:

既然在一个类中使用公共变量(相反,使用 getter 和 setter)被认为是不好的 OO 实践,那么为什么不在 all 变量上使用 private 呢?如果这是不好的做法,为什么 Java 甚至允许使用 public

(这显然不适用于函数)

【问题讨论】:

  • 尽管我花了 2 美分来回答这个问题,但我认为这个问题除了猜测(其中有很多猜测)之外没有任何答案,除非高斯林停下来解释自己。

标签: java oop encapsulation


【解决方案1】:

public static final 变量就是一个很好的例子。像一个常数。

【讨论】:

    【解决方案2】:

    拥有publicprivate 字段是一项设计决策。该语言本身应该使程序员做出自己的设计决策,而不是强制开发人员或团队可能不一定想要实现的设计。

    语言越灵活,功能就越强大。由项目经理、团队或个人开发人员确定访问字段的最合适方式。

    【讨论】:

      【解决方案3】:

      变量字段的访问控制不是唯一的问题。

      考虑简单。 Java 对所有类型的访问控制都有一个默认值。这比为不同类型设置不同的访问规则更容易学习。

      考虑新用户的可用性。如果默认情况下所有内容都是私有的,那么新用户很可能会对为什么无法访问某些内容感到困惑。

      最后,请注意,“getter 和 setter”并不总是公共字段的合适替代品。有些字段不应该被修改甚至在类之外访问。

      [编辑]选择背后还有一个历史原因。 Java 的最早版本,当时称为“Oak”,没有私有访问权限。默认和最受限制的访问是包保护的。 (参考:此2002 Java newsletter,引用Oak 0.2 manual。)

      【讨论】:

        【解决方案4】:

        我想很大一部分原因是“C++ 就是这样做的”。不同的语言在这个问题上存在分歧,所以这显然不是唯一明智的选择。例如。 Python 将所有内容都公开并信任您遵循库的文档,而 Ruby 只有私有字段。

        【讨论】:

          【解决方案5】:

          这是关于您想在哪里发布该字段。

          对于public 字段,您可以安全地为final 字段执行此操作,例如常量:

          public static final ...
          

          还有final 字段:

          public final ...
          

          就像 java 数组中的 length 字段。尽管约定是提供访问器方法(getter)而不是公开字段。

          当您要将字段发布到时,请使用 protected 字段 子类。

          当您想将字段发布到同一包中的其他类时,请使用默认可见性(即未指定)。

          【讨论】:

            【解决方案6】:

            我认为有这种可能性很好(不包括static final常量),因为你可以用它来快速解决一些问题(而不是定义getter和setter),你只需要在这里小心打破封装规则.

            【讨论】:

              【解决方案7】:

              这是管理复杂性的问题。

              可以从类外部访问public 成员,出于实际考虑,这意味着“可能在任何地方”。如果public 字段出现问题,罪魁祸首可能在任何地方,因此为了追踪错误,您可能需要查看大量代码。

              private 成员只能从同一个类内部访问,因此如果出现问题,通常只有一个源文件可供查看。如果您的项目中有 100 万行代码,但您的类很小,这可以大大减少您的错误跟踪工作。

              另一个优点与coupling 的概念有关。有些答案忘了提到这一点。

              我会说默认情况下将所有内容设为private,然后只公开那些绝对必须为public 的部分(或者只使用getter 和setter)。 private 越多越好。

              【讨论】:

                猜你喜欢
                • 2019-08-30
                • 2011-03-07
                • 2022-08-22
                • 2019-12-30
                • 1970-01-01
                • 2016-08-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多