大约两个月前, 斯图尔特·马克斯 ( Stuart Marks)写道:“ 不变性就像葡萄酒 。” 然后,他提醒读者注意叔本华的熵定律 :“如果将一勺酒倒入装满污水的桶中,就会产生污水。 如果将一勺污水倒入装满葡萄酒的桶中,就会产生污水。” 以此为背景,马克将叔本华的熵定律应用于不变性,用“不变性”代替“酒”,用“可变性”代替“污水”,以得出深刻见解:


同样,如果在可变的东西上增加一点不变性,那么您将获得可变性。 而且,如果您在不可变的内容上添加一些可变性,那么您将获得可变性。

此引用的上下文是自10月开始的在线讨论,内容涉及以JDK 10为目标的JDK-8177290 (“为不可修改的列表,集合,映射添加复制工厂方法”)和JDK-8184690 (“为收集到不可修改的列表,集合添加添加收集器”)和地图”)。 JDK-8177290是JDK-8156070 (“不可变集合”的增强功能)的子任务,被描述为“用于不可变集合的各种增强和改进子任务的容器”。 讨论时间很长,涉及多种观点,而且常常涉及完全不同的观点,涉及诸如“不变”和“不可修改”之类的术语。 确实,在讨论的第一篇文章中,Mark写道:“在涉及数据结构时,术语“ 不变 ”与“ 持久性 ”密不可分,如果Java的“不变”意味着某种意义,我相信我们将永远对此进行解释。与其他人不同。”

最终确定要使用的术语的指针可以在与JDK-8191517相关的当前文本中找到 (“为不可修改的列表,集合,映射添加复制工厂方法”)。 本文包含以下陈述:“为“视图”集合,“不可修改”集合和“不可修改视图”集合提供定义。” JDK-8191517还参考了webrev.4.zip和specdiff.4.zip,以获取其他低级详细信息。 这篇文章的其余部分将介绍那些引用的ZIP文件中记录的一些低级详细信息。

在引用的zip文件中添加到选择接口的源代码的Javadoc注释包含有关术语“ 视图集合 ”,“ 不可修改的集合 ”和“ 视图 不可修改的集合 ”的其他详细信息。 例如,用于java.util.Collection的Javadoc在其接口级Javadoc注释中添加了以下描述:

  • 查看集合 ” –“大多数集合管理它们所包含元素的存储。 相比之下, 视图集合本身并不存储元素,而是依靠后备集合来存储实际元素。 视图集合本身未处理的操作将委托给后备集合。”

    • 关于修改:“对后备集合所做的任何更改都可以在视图集合中看到。
  • 不可修改的集合 ” - “ 不可修改的Collection是一个集合,其所有mutator方法......被指定抛出UnsupportedOperationException异常。 因此,不能通过在其上调用任何方法来修改此类集合。 为了使一个集合正确地不可修改,从该集合派生的任何视图集合也必须不可修改。”
    • 关于修改:“不可修改的集合不一定是不变的。
  • 修改视图集合 ” - “ 不可修改视图集合是一个集合,是不可修改的,并且也是一个视图在背衬集合。 如上所述,它的mutator方法抛出UnsupportedOperationException},而将读取和查询方法委托给后备集合。 结果是提供对后备集合的只读访问。”
    • 关于修改:“请注意,仍可能对支持集合进行更改,并且如果发生更改,则可以通过不可修改的视图看到它们。

上面的项目符号详细介绍了添加到Javadoc中的java.util.Collection类的注释,但是其他collection接口的Javadoc注释也具有与这些特定接口相关的不变性和不可修改性的重要新注释。 例如,先前引用的ZIP文件中显示的java.util.List接口Javadoc注释讨论了“不可修改的列表”,可用于访问此类List的便捷机制以及通过这些机制检索的List的特征。 java.util.Setjava.util.Map接口的Javadoc注释也得到类似的处理。

到目前为止,我主要集中于如何增强Javadoc文档以及如何将术语从“不变”更改为“不可修改”。 但是,在这里值得指出的是,术语的这种变化与新的“复制工厂方法”和新的收集器的添加有关,这将使访问不可修改的收集变得更加容易。 JDK-8191517总结了这些新方法:

  • “向java.util.ListSetMap添加一族copyOf()方法,以复制现有集合或Map中的元素。”
  • “将一组收集器添加到java.util.stream.Collectors ,这些收集器将从流中创建不可修改的ListSetMap 。”

即将到来的Map.copyOf(Map)方法的Javadoc注释指出:“返回包含给定Map条目的不可修改Map。 给定的Map不能为null,并且不得包含任何null键或值。 如果随后修改了给定的地图,则返回的地图将不会反映出这些修改。” Javadoc注释中一个有趣的(但并不奇怪)的“实施说明”指出:“如果给定的Map是不可修改的Map,则调用copyOf通常不会创建副本。” 使用Java 9添加到Map的许多重载Map.of()方法都对其Javadoc注释进行了修改,以将“ immutable”替换为“ unmodifiable”,并将对“ Immutable Map Static Factory Methods ”部分的引用替换为对新名称的引用。该部分(“不可修改的地图”)。 术语“结构上不变的”也已由“不可修改的”代替。

Set.copyOf(Collection)List.copyOf(Collection)来的Java 10方法类似于在最后一段描述Map.copyOf(Map)其中包括在评论术语所提到的相同的更改Map

JDK-8191517对Java 10中的Collectors类的补充是toUnmodifiableList()toUnmodifiableSet()的四个方法,以及toUnmodifiableMap(-)两个重载版本(一个版本接受BinaryOperator参数)。

随着人们越来越普遍地实现不变性的优点,并且随着Java开发人员努力在其应用程序中更频繁地应用不变性,通常重要的是准确地知道如何修改给定的结构,集合或视图。 JDK 10计划添加更多方法,以使Java开发人员更容易实现collection的不变性(或至少不可修改),并且对最重要的接口和Collections类的注释应有助于开发人员更清楚地了解什么是可变的以及他们为应用选择的构造中哪些是不可变的。

翻译自: https://www.javacodegeeks.com/2018/01/immutable-versus-unmodifiable-jdk-10.html

在JDK 10中不可变与不可修改相关推荐

  1. jdk 1.8 不可变常量_在JDK 10中不可变与不可修改

    jdk 1.8 不可变常量 大约两个月前, 斯图尔特·马克斯 ( Stuart Marks)写道:" 不变性就像葡萄酒 ." 然后,他提醒读者注意叔本华的熵定律 :"如果 ...

  2. 一文汇总 JDK 5 到 JDK 15 中的牛逼功能!

    前言 JDK 16 马上就要发布啦(预计 2021.3.16 日发布),所以在发布之前,让我们先来回顾一下 JDK 5-15 的新特性吧,大家一起学起来~ Java 5 新特性 1. 泛型 泛型本质是 ...

  3. java -d32_java11教程--JDK 10删除和不推荐的功能和选项-2

    工具/ javadoc(工具) 删除旧的(JDK 6,JDK 7和JDK 8 Era)标准Doclet 在此发行版中已删除了旧的(JDK 6,JDK 7和JDK 8时代)标准doclet,该标准doc ...

  4. jdk10与jdk9的区别_JDK 8与JDK 10:三元/拆箱的区别

    jdk10与jdk9的区别 最近的Nicolai Parlog ( @nipafx ) 鸣叫引起了我的注意,因为它引用了一个有趣的StackOverflow讨论 ,该讨论涉及JDK 8和JDK 10之 ...

  5. destroy 方法_线程方法destroy()和stop(Throwable)在JDK 11中删除

    destroy 方法 @DrDeprecator (Stuart Marks)在core-libs-dev OpenJDK邮件列表上的消息" RFR(s):8204243:remove Th ...

  6. JDK 8与JDK 10:三元/拆箱的区别

    最近的Nicolai Parlog ( @nipafx ) 鸣叫引起了我的注意,因为它引用了关于JDK 8和JDK 10之间行为更改的有趣StackOverflow讨论 ,并询问"为什么?& ...

  7. 线程方法destroy()和stop(Throwable)在JDK 11中删除

    @DrDeprecator (Stuart Marks)在core-libs-dev OpenJDK邮件列表上的消息" RFR(s):8204243:remove Thread.destro ...

  8. 从Java 10中删除的API

    在博客文章" JDK 10 Release Candidate Phase "中,我研究了JDK 10可能包含的十二个新功能. 在本文中,我介绍了一些可能会在JDK 10中删除的A ...

  9. JDK 10:FutureTask获取一个toString()

    我已经有很长时间了,对于大多数具有独特属性的Java类,开发人员应该花时间重写Object.toString() ,即使它只是通过IDE生成的实现或使用诸如Apache之类的库类来实现Commons ...

最新文章

  1. Django的Form表单
  2. java面板如何设置大小_java面板调整大小问题
  3. Tiny6410之重定位代码到SDRAM
  4. c语言抓取机器硬件阐述,c语言如何控制硬件
  5. Nginx深入详解之过滤模块
  6. Vijos p1484 ISBN号码
  7. 解决VS2010 beta2 安装后html标签和script智能提示不起作用的问题
  8. Html input file控件使用accept过滤 限制的文件类型
  9. python类与方法与函数_Python 中的函数与类的方法
  10. Xamarin学习笔记之尝试篇
  11. 论文精读——基于演化动力学的复杂网络中带阈值雪堆博弈模型研究
  12. Arcgis应用(十二)栅格数据翻转(Flip)、镜像(Mirror)、重缩放(Rescale)、旋转(Rotate)、移位(Shift)、弯曲(Warp)
  13. C#微信开发---用户关注微信号后公众号发送欢迎关注
  14. 常用论文检查语法错误软件和网址
  15. 【人工智能】谭铁牛院士:人工智能新动态
  16. “智慧高速公路”建设应重点提升“智慧化的出行服务”
  17. 微信小程序如何制作?快捷方法有哪些?
  18. 2019年最新出搜索引擎蜘蛛网页爬虫大全
  19. shell if -n 参数
  20. linux下载东西显示No package nginx available.无库可用

热门文章

  1. Flowable学习笔记(二、BPMN 2.0-基础 )
  2. 到底什么是 OAuth 2.0
  3. 14-多对多关系建表
  4. 没有回家的等于没过年
  5. ps中对齐,历史记录,图层
  6. 最全三大框架整合(使用映射)——applicationContext.xml里面的配置
  7. 处理目录的常用命令---Linux
  8. JavaScript(笔记)
  9. WIN10的IE错误代码inet_e_resource_not_found解决办法
  10. (转)Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean