java - 一个不可变的类成员应该有一个访问方法还是允许公开?

标签 java immutability private public accessor

我有一个关于最佳设计实践的问题。我一直在尝试在我的项目中构建更多不可变组件,因为我了解到从长远来看它们更容易维护,并且想对此进行测试。

当你有一个包含不可变数据成员的类时,比如

 public/private final int importantNumber = 3;

是否仍应将 int 声明为 private 并为其提供访问器方法,或者因为它是 final,允许直接访问并使其公开有什么困难?我认为公开它没有任何问题,因为您无法更改它。

在我的例子中,不可变对象(immutable对象)是用传递给它的值创建的,然后将从数据库中自动填充其他对象,一切都是最终的。

或者这仅仅是一个偏好问题,会引发一场宗教 war ?由于有很多关于从类内部访问数据成员的问题,我想澄清一下,我是从另一个试图获取值的外部类中询问的。

最佳答案

将事物公开允许其他代码依赖它。

数据是可变的还是不可变的并不重要。一旦一些其他代码使自己依赖该信息,您就会引发 future 的问题。在任何较大的项目中,这些问题迟早会 显现出来。

突然间,(内部)实现细节可能会泄露到其他代码中!当然:如果该数据是可变的,那只会打开一个真正的蠕虫 jar 头。

但即使是一个简单的 if (someObject.someField == whatever) then do this else do that 也会很快变成一个大问题。假设您在大型项目的 10、50、100 个不同位置都有该代码。

因此,您的默认规则是:隐藏您的信息。 公开异常(exception),它发生是因为您绝对希望您的设计是那样的。您的默认 是为您的字段(甚至方法)提供最严格的可见性,但仍允许您实现您的要求。

注意:隐藏字段并为其提供访问器方法只是“稍微”好一点。因为 if (someObject.someMethod() == ...) 会导致相同 问题。而且(几乎)更糟:现在您决定 someMethod() 应该做一些不同的事情,以解决一个特定的问题。但是您确定该方法调用的 其他 99 种用法适用于该更改吗?!

最后警告:Java 9 引入了模块概念,因此您现在终于可以公开某些内容,但仍然无法从模块外部使用。但这更像是一个理论附录,我仍然会遵循基本规则,除非我有充分的理由这样做,否则不要将事情公开。如果您想访问该信息,比如用于单元测试,那么应该使用包保护的 getter。

关于java - 一个不可变的类成员应该有一个访问方法还是允许公开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54443054/

相关文章:

java - 当代码推送到远程服务器时,maven 依赖不支持

c# - 在 C# 中,方法是否可以返回 List 以便客户端只能读取它而不能写入它?

c++ - 专门为私有(private)类(class)的功能?

C++ 将源文件中的某些函数设为私有(private)的最佳方法是什么?

scala - 为什么 Scala 的 toSeq 将不可变的 Set 转换为可变的 ArrayBuffer?

c# - 从外部类调用私有(private)事件处理程序

java - Spring Beans - 如何将null作为构造函数arg?

java - 摆脱 GridBagLayout Java GUI 中按钮之间的空间?

java - 以多对多关系的方式将数据添加到对象中,

c# - 不可变的集合?