不严格也就是说,可以使对象变异的引用不能被转换为不能使对象变异的引用。另外,除了使用约定之外,没有办法表示一个类型是不可变的或可变的。
确保某种形式的不变性的唯一功能将是最后的领域 – 一旦写入,它们就不能被修改。
也就是说,有办法设计类,以防止不必要的突变。这里有一些技巧:
> Defensive Copying.传递对象的副本,以便如果它是突变的,则不会破坏您的内部不变量。
>使用访问修饰符和/或接口仅公开只读方法。您可以使用访问修改(public / private / protected),可能与接口组合,以便只有某些方法对其他对象可见。如果暴露的方法本质上是只读的,那么你是安全的。
>默认情况下使您的对象不可变。对象上的任何操作实际上都会返回对象的副本。
另外请注意,SDK中的API有时会返回对象的不可变版本,例如Collections.unmodifiableList。尝试突变不可变列表将抛出异常。这不会静态地强制执行不变性(在使用静态类型系统的编译时),而是动态(在运行时)强制执行它的便宜而有效的方法。
有许多关于Java扩展的研究建议,以更好地控制混叠和可访问性。例如,添加一个只读关键字。没有一个是我知道计划在未来版本的Java中包含的。如果您有兴趣,可以看看这些指针:
Checker框架非常有趣。在Checker框架中,查看Generic Universe Types检查器,IGJ不可变性检查器和Javari不可变性检查器。该框架使用注释工作,所以它不是侵扰性的。