- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个关于最佳设计实践的问题。我一直在尝试在我的项目中构建更多不可变组件,因为我了解到从长远来看它们更容易维护,并且想对此进行测试。
当你有一个包含不可变数据成员的类时,比如
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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!