【发布时间】:2011-01-13 00:30:34
【问题描述】:
一般来说,我在 Java 中使用不可变对象的次数越多,我就越认为它们是个好主意。它们有很多优点,从自动成为线程安全到无需担心克隆或复制构造函数。
这让我想到,“不可变”关键字会出错吗?显然,在语言中添加另一个保留字是有缺点的,我怀疑它是否会主要出于上述原因而发生 - 但忽略我真的看不出很多缺点。
目前必须非常小心地确保对象是不可变的,即使这样,一个狡猾的 javadoc 注释声称组件对象是不可变的,而实际上它不是不可变的,这可能会破坏整个事情。还有一种观点认为,即使是像字符串这样的基本对象也不是真正不可变的,因为它们很容易受到反射攻击。
如果我们有一个 immutable 关键字,编译器肯定可以递归检查并给出一个铁定的保证,即一个类的所有实例都是不可变的,这是目前无法做到的。尤其是在并发越来越多的情况下,我个人认为在这个效果上加个关键字会更好。但是是否有任何我遗漏的缺点或实现细节使这成为一个坏主意?
【问题讨论】:
-
这听起来没有必要,而且使用起来极其有限。
-
@Falmarri 相反,我认为不可变对象使用得相当多。
-
@Falmarri 不可变对象被大量使用——正如我所指出的,特别是随着多线程变得越来越流行,不可变对象正成为一种好的设计实践(Bloch 在有效的 Java,所以不仅仅是我这么说。)让编译器保证一个对象是不可变的,因此它的内容是线程安全的,在许多场景中确实非常有用!
-
不可变对象是线程安全的,因为它是常量。公共静态最终类成员有什么问题?
-
@Falmarri:这里缺少两点。首先,这与线程安全无关(尽管线程安全是具有不变性的一个很好的理由)。其次,这个想法是让语言具有更容易编写正确代码的特性。说“只写正确的代码”并没有那么有用。
标签: java immutability keyword