Java:何时不使用`private`

时间:2013-03-10 20:36:44

标签: java oop encapsulation

由于在一个类中使用公共变量(而不是使用getter和setter)被认为是错误的OO练习,那么为什么不在所有变量上使用private?为什么Java甚至允许使用public如果这是不好的做法?

(这显然不适用于功能)

7 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

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

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

答案 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),你只需要在这里小心谨慎封装规则。