是否可以将对象设置为"只读"方法

Don*_* Li 20 java reference object

如果将对象引用传递给方法,是否可以将该对象设置为方法"只读"?

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.该框架使用注释工作,因此它不是侵入性的.


Dav*_*ton 7

不,不是没有装饰,合成,克隆等.


Mar*_*nik 7

没有一般的机制.您需要编写特殊情况代码来实现它,比如编写一个不可变的包装器(请参阅参考资料Collections.unmodifiableList).