确保该类是不可变的

Mar*_*zak 6 java immutability

这个 6岁的问题中,最高答案说,无法验证不变性.另一方面,在底部有两个最近的答案,表明可以使用:

检测类是否是不可变的.

我的问题是:这些工具在现实生活中是否有用?还有其他(更好的)解决方案吗?在过去几年中有什么变化吗?

Ada*_*ent 1

虽然我确信有很多工具可以直接测试类是否不可变,但真正的问题是测试允许具有接口或抽象类声明的字段的不可变类。基本上只有密封的不可变类可以被允许作为子字段,因为继承通常会破坏不可变性。

Map如果不使用 Java Collections API(即不使用、ListSet等),很难创建复合不可变对象。

另一个问题是,仅仅因为一个字段是final“最终”字段并不能真正使其成为“最终”字段。许多序列化工具(例如 Hibernate)会很乐意构造不可变对象并通过反射设置最终字段。

我看到的唯一真正的方法是通过运行时分析来检测真正的不变性,但是您的代码可能需要很长时间才能真正达到发生可变性的特定用例,并且我认为这种仪器相当昂贵。

不可变对象的另一个有趣的假设推论是,它们在构造时不应该改变外部的东西。也就是说,构造一个不可变的对象应该没有副作用。这就是工具会遇到困难的地方。您可以轻松地使用构造函数创建一个不可变对象,该构造函数执行各种外部肮脏操作,例如启动线程或设置系统属性。