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