【发布时间】:2012-07-04 11:29:15
【问题描述】:
我目前正在开发一个多线程框架。为了避免副作用,我想要求框架操作的所有数据都必须是不可变的。
那么在 Java 中是否存在一种方法来指定我希望给定类的所有子类或实现给定接口的所有类都是不可变的?
【问题讨论】:
-
@Traroth:这可能允许您通过反射检测它,但不强制它从(编译时)开始。一些discussion in this thread 是相关的。
-
@Traroth: "并检查类型是否是最终的,以及该类型的所有字段是否都是最终的" 并且这些 字段 是不可变的.你可以在你的子类中有一个
private final Foo foo-foo引用不能改变,但如果Foo是可变的,那么你的子类也是。 -
@Traroth 来自 JSR-305 的
@Immutable已经满足了这一需求。但是,问题不在于创建注释,而在于能够强制/检查它是否实际得到支持。根据您想要的严格程度,您可能必须采取诸如安装自己的安全管理器之类的路线,以检查是否没有使用反射来改变私有最终字段。如果您无法控制这种情况,客户总有办法绕过您的要求。 -
@Traroth @Immutable 注释没有进入 Java 7,并且 (AFAIK) 不太可能被添加到 Java 8。该注释在我之前评论中链接到的 jar 中可用,在包
javax.annotation.concurrent。但是,它不会触发任何行为,并且很少有自动化工具可以利用它,因此注释主要用于文档目的。 -
@Voo 大部分函数式编程语言(如果不是所有函数式编程语言)甚至默认实现不变性。 (例如:Haskell、OCaml。)在命令式语言中,不变性已经开始受到关注,但大多数语言都是半途而废的(C++ 中的
const);我会在现代命令式语言中寻找一种具有它的语言(也许是 Kotlin)。
标签: java immutability