既然在一个类中拥有公共变量被认为是不好的 OO 实践(而是使用 getter 和 setter),那么为什么不在private
所有变量上使用呢?public
如果这是不好的做法,为什么 Java 甚至允许使用?
(这显然不适用于函数)
既然在一个类中拥有公共变量被认为是不好的 OO 实践(而是使用 getter 和 setter),那么为什么不在private
所有变量上使用呢?public
如果这是不好的做法,为什么 Java 甚至允许使用?
(这显然不适用于函数)
例如,public static final
变量是一个很好的理由。像一个常数。
拥有public
orprivate
字段是一个设计决策。该语言本身应该使程序员能够做出自己的设计决策,而不是强制执行开发人员或团队可能不一定想要实现的设计。
语言越灵活,它就越强大。由项目经理、团队或个人开发人员确定访问字段的最合适方式。
变量字段的访问控制不是唯一的问题。
考虑简单。Java 对所有类型的访问控制都有一个默认值。这比为不同类型设置不同的访问规则更容易学习。
考虑新用户的可用性。如果默认情况下所有内容都是私有的,那么新用户可能会对为什么无法访问某些内容感到困惑。
最后,请注意“getter 和 setter”并不总是公共字段的适当替代方案。有些字段不应该被修改,甚至不应该在类外访问。
[编辑]选择背后还有一个历史原因。Java 的最早版本(当时称为“Oak” )没有私有访问权限。默认和最受限制的访问是包保护的。(参考:this 2002 Java newsletter,引用Oak 0.2 手册。)
这是关于您要在何处发布该字段。
对于public
字段,您可以安全地为final
字段执行此操作,例如常量:
public static final ...
和final
领域:
public final ...
就像length
java数组中的字段一样。尽管约定是提供访问器方法(getter)而不是公开字段。
protected
当您要将字段发布到子类时,请使用字段。
当您想将字段发布到同一包中的其他类时,请使用默认可见性(即未指定)。
我认为有这种可能性(不包括static final
常量)很好,因为您可以使用它来快速解决一些问题(而不是定义 getter 和 setter),您只需要在这里小心打破封装规则即可。
这是管理复杂性的问题。
可以public
从类外部访问成员,出于实际考虑,这意味着“可能在任何地方”。如果某个public
字段出现问题,罪魁祸首可能在任何地方,因此为了追踪错误,您可能需要查看大量代码。
一个private
成员只能从同一个类内部访问,所以如果出现问题,通常只有一个源文件可供查看。如果您的项目中有 100 万行代码,但您的类很小,这可以大大减少您的错误跟踪工作。
另一个优点与耦合的概念有关。有些答案忘了提到这一点。
我会说private
默认设置所有内容,然后只公开那些绝对必须的部分public
(或者只使用 getter 和 setter)。你能做private
的越多越好。
我想很大一部分原因是“C++ 就是这样做的”。不同的语言在这个问题上存在分歧,所以这显然不是唯一明智的选择。例如,Python 将所有内容都公开并信任您遵循库的文档,而 Ruby 只有私有字段。