gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:47 27 4
gpt4 key购买 nike

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

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

 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com