4

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

(这显然不适用于函数)

4

7 回答 7

8

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

于 2013-03-10T20:37:58.407 回答
4

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

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

于 2013-03-10T20:41:55.143 回答
2

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

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

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

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

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

于 2013-03-10T20:41:36.270 回答
0

这是关于您要在何处发布该字段。

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

public static final ...

final领域:

public final ...

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

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

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

于 2013-03-10T20:47:39.480 回答
0

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

于 2013-03-10T20:50:17.913 回答
0

这是管理复杂性的问题。

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

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

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

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

于 2013-03-10T20:42:06.190 回答
0

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

于 2013-03-10T20:43:45.947 回答