不严格地说。即,不能将对象突变的引用不能转换为不能对象的引用。另外,除了使用约定外,没有其他方法可以表示类型是不可变的或可变的。
确保某种形式的不变性的唯一功能就是
final字段-一旦写入,就不能修改。
也就是说,有一些方法可以设计类,从而 防止不必要的变异 。这里有一些技巧:
防御复制 。传递对象的副本,这样,如果该对象被突变,则不会破坏您的内部不变性。
使用 访问修饰符 和/或 接口 仅公开只读方法。您可以使用访问修饰符(
public
/private
/protected
)(可能与接口结合使用),以便其他对象只能看到某些方法。如果公开的方法本质上是只读的,那么您是安全的。默认 使您的对象 不可变 。对对象的任何 *** 作实际上都返回该对象的副本。
另外,请注意,SDK中的API有时有时会返回对象的不可变版本的方法,例如
Collections.unmodifiableList。尝试更改不可变列表将引发异常。这不会静态地(在编译时使用静态类型系统)强制实施不变性,而是一种动态(在运行时)强制实施不变性的廉价有效方法。
Java扩展已有许多研究建议,以更好地控制别名和可访问性。例如,添加
readonly关键字。据我所知,它们都没有计划包含在Java的未来版本中。如果您有兴趣,可以看看这些指针:
- 为什么我们不应该向Java添加“只读”(至今) -它列出并比较了大多数建议
- Checker framework:Java的自定义可插入类型 -一种非侵入性的方式来扩展类型系统,尤其是不可变类型。
Checker框架非常有趣。在Checker framework中,查看Generic Universe
Types检查器,IGJ不可变性检查器和Javari不可变性检查器。该框架使用注释进行工作,因此不是侵入性的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)