ewe*_*nli 19
严格来说,不是.也就是说,可以改变对象的引用不能转换为不能改变对象的引用.此外,除了使用约定之外,没有办法表明类型是不可变的或可变的.
确保某种形式的不变性的唯一特征是final字段 - 一旦写入就无法修改.
也就是说,有一些方法来设计类,以防止不必要的突变.以下是一些技巧:
防御性复制.传递对象的副本,这样如果它被突变,它不会破坏你的内部不变量.
使用访问修饰符和/或接口仅显示只读方法.您可以使用访问修改(public/ private/ protected),可能与接口结合使用,以便只有某些方法对另一个对象可见.如果暴露的方法本质上是只读的,那么您就是安全的.
默认情况下,使对象不可变.对象上的任何操作实际上都返回该对象的副本.
另请注意,SDK中的API有时会返回对象的不可变版本的方法,例如Collections.unmodifiableList.尝试改变不可变列表将引发异常.这不会静态强制执行不变性(在编译时使用静态类型系统),但它是一种廉价有效的动态(在运行时)强制执行它的方法.
已经有许多关于Java扩展的研究提议,以更好地控制别名和可访问性.例如,添加readonly关键字.据我所知,它们都没有包含在未来的Java版本中.如果您有兴趣,可以查看这些指针:
Checker Framework非常有趣.在Checker Framework中,查看Generic Universe Types checker,IGJ immutability checker和Javari immutability checker.该框架使用注释工作,因此它不是侵入性的.
| 归档时间: |
|
| 查看次数: |
13501 次 |
| 最近记录: |