Java:当不使用`私人`

问题描述:

因为它被认为是不好的OO实践中有一个类中的公共变量(而不是使用getters和setters)那么为什么不使用private所有变量?为什么Java甚至允许使用public,如果这是不好的做法?Java:当不使用`私人`

(这并不适用于功能,很明显)

+1

无论我在答案中抛出了2分钱,我都不认为这个问题是可以回答的,只是猜测(其中有很多),因此Gosling停下来解释自己。 – millimoose 2013-03-10 20:45:41

public static final变量是例如一个很好的理由。像一个常数。

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

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

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

最后,请注意,“获得者和制定者”并不总是适合公共领域的替代方案。一些字段不应该修改,甚至不能在课堂外进行访问。

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

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

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

这是一个管理复杂性的问题。

A public成员可以从课堂以外进行访问,实际考虑意味着“可能在任何地方”。如果public字段出现问题,罪魁祸首可能在任何地方,所以为了追踪错误,您可能需要查看相当多的代码。

A private成员只能从同一个类内部访问,所以如果出现问题,通常只有一个源文件需要查看。如果您的项目中有一百万行代码,但您的课程保持较小,这可以大大减少您的错误跟踪工作量。

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

我想说默认情况下所有东西都是private,然后只显示绝对必须是public(或者只是使用getter和setter)的那些部分。你越能做出更好的private

我想很好的一部分原因是“C++做到了这一点”。不同的语言在这个问题上不同意,所以它显然不是唯一明智的选择。例如。 Python拥有一切公开的内容,并且信任你遵循图书馆的文档,而Ruby只有私人领域。

这是关于你想要在哪里发布该领域。

对于public领域,你可以安全地用于final领域做到这一点,像常量:

public static final ... 

而且final领域:

public final ... 

像Java数组的length领域。虽然这个惯例是提供一个访问方法(getter),而不是公开某个字段。

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

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

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