当前位置: 首页 > 面试题库 >

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

吕作人
2023-03-14
问题内容

如果将对象引用传递给方法,是否可以将对象“只读”到该方法?


问题答案:

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

确保某种形式的不变性的唯一功能就是final字段-一旦写入,就不能修改。

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

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

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

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

另外,请注意,SDK中的API有时有时会返回对象的不可变版本的方法,例如Collections.unmodifiableList。尝试更改不可变列表将引发异常。这不会静态地(在编译时使用静态类型系统)强制实施不变性,而是一种动态(在运行时)强制实施不变性的廉价有效方法。

Java扩展已有许多研究建议,以更好地控制别名和可访问性。例如,添加readonly关键字。据我所知,它们都没有计划包含在Java的未来版本中。如果您有兴趣,可以看看这些指针:

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

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



 类似资料:
  • 问题内容: 我知道通过应用boolean属性将输入元素设为只读,并且该属性不受CSS的影响。 另一方面,我的情况似乎非常适合CSS,因此我希望可以使用某种CSS技巧来实现。我的表格上有 可打印的版本 超链接。单击它会显示文档的可打印版本。它主要是CSS东西,我的print.css看起来像这样: 还有一些javascript片段,例如: 将类添加到html元素 显示没有滚动条的表 其他一些小事情,例

  • 目前,我正在尝试保存一个ImageView对象,如下所示 如何进行此转换,或者是否有更好的方法来保存ImageView对象?

  • 问题内容: 我知道可以偏斜,但我看不到以特定角度偏斜每个角的方法。 这是我正在从事的项目: 专门查看菜单中的标签。现在,我正在使用图像,我想针对功能强大的浏览器进行更改。 我知道可以创建CSS trapazoid,但是使用没有内容的边框。最终结果还需要一些圆角。 问题答案: 这可能是一个大概的想法:

  • 问题内容: 例如,如果我有两个对象: 和 我想将x和y值从foo转移到oof。有没有办法使用es6解构语法来做到这一点? 也许像这样: 问题答案: 虽然丑陋且有点重复,但您可以 它将读取对象的两个值,并将它们写入对象上它们各自的位置。 就个人而言,我还是想读 要么 虽然。

  • 问题内容: 动物是狗的超类,狗有一种叫bark的方法 考虑以下: 会发生什么? the assignment isn’t allowed the call to bark is allowed and “woof” is printed at run time the call to bark is allowed but nothing is printed the call to bark c

  • 问题内容: 有什么方法可以从中创建对象吗? 我的要求是从RAR读取文件。我不是要写一个临时文件,而是要在RAR存档中找到一个文件。 问题答案: 您需要创建新文件并将内容复制到该文件: 我使用方便来避免手动复制流。它还具有内置缓冲。