虽然我确信有很多工具可以直接测试类是否不可变,但真正的问题是测试允许具有接口或抽象类声明的字段的不可变类。基本上只有密封的不可变类可以被允许作为子字段,因为继承通常会破坏不可变性。
Map如果不使用 Java Collections API(即不使用、List或Set等),很难创建复合不可变对象。
另一个问题是,仅仅因为一个字段是final“最终”字段并不能真正使其成为“最终”字段。许多序列化工具(例如 Hibernate)会很乐意构造不可变对象并通过反射设置最终字段。
我看到的唯一真正的方法是通过运行时分析来检测真正的不变性,但是您的代码可能需要很长时间才能真正达到发生可变性的特定用例,并且我认为这种仪器相当昂贵。
不可变对象的另一个有趣的假设推论是,它们在构造时不应该改变外部的东西。也就是说,构造一个不可变的对象应该没有副作用。这就是工具会遇到困难的地方。您可以轻松地使用构造函数创建一个不可变对象,该构造函数执行各种外部肮脏操作,例如启动线程或设置系统属性。