是否可以将对象设为“只读”方法

是否可以将对象设为“只读”方法,第1张

是否可以将对象设为“只读”方法

不严格地说。即,不能将对象突变的引用不能转换为不能对象的引用。另外,除了使用约定外,没有其他方法可以表示类型是不可变的或可变的。

确保某种形式的不变性的唯一功能就是

final
字段-一旦写入,就不能修改。

也就是说,有一些方法可以设计类,从而 防止不必要的变异 。这里有一些技巧:

  • 防御复制 。传递对象的副本,这样,如果该对象被突变,则不会破坏您的内部不变性。

  • 使用 访问修饰符 和/或 接口 仅公开只读方法。您可以使用访问修饰符(

    public
    /
    private
    /
    protected
    )(可能与接口结合使用),以便其他对象只能看到某些方法。如果公开的方法本质上是只读的,那么您是安全的。

  • 默认 使您的对象 不可变 。对对象的任何 *** 作实际上都返回该对象的副本。

另外,请注意,SDK中的API有时有时会返回对象的不可变版本的方法,例如

Collections.unmodifiableList
。尝试更改不可变列表将引发异常。这不会静态地(在编译时使用静态类型系统)强制实施不变性,而是一种动态(在运行时)强制实施不变性的廉价有效方法。

Java扩展已有许多研究建议,以更好地控制别名和可访问性。例如,添加

readonly
关键字。据我所知,它们都没有计划包含在Java的未来版本中。如果您有兴趣,可以看看这些指针:

  • 为什么我们不应该向Java添加“只读”(至今) -它列出并比较了大多数建议
  • Checker framework:Java的自定义可插入类型 -一种非侵入性的方式来扩展类型系统,尤其是不可变类型。

Checker框架非常有趣。在Checker framework中,查看Generic Universe
Types检查器,IGJ不可变性检查器和Javari不可变性检查器。该框架使用注释进行工作,因此不是侵入性的。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5616023.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存