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

jdk 1.8 不可变常量

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


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

此报价的上下文是自10月开始的在线讨论,内容涉及以JDK 10为目标的JDK-8177290 (“为不可修改的列表,集合,映射添加复制工厂方法”)和JDK-8184690 (“向未修改的列表,集合添加收集器”)和地图”)。 JDK-8177290是JDK-8156070 (“不可变集合增强”)的子任务,它被描述为“用于不可变集合的各种增强和改进子任务的容器”。 讨论时间很长,涉及多种观点,而且常常有截然不同的观点,涉及诸如“不变”和“不可修改”之类的术语。 确实,在讨论的第一篇文章中,马克写道:“涉及数据结构时,术语“ 不可变 ”与“ 持久性 ”密不可分,如果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开发人员更容易实现集合的不变性(或至少不可修改),并且对最重要的接口和Collections类的注释应有助于开发者更清楚地了解可变的内容以及在为其应用程序选择的构造中哪些是不可变的。

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

jdk 1.8 不可变常量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

diff算法_传统Diff算法为什么时间复杂度要O(n ^3)

原文链接:https://juejin.im/post/6892671384976097287很多文章提到的都是新旧DOM树需要两两对比,但是没有说清楚为什么。思考大家想一下,如果让你来设计将一棵树转换为另一棵树,你会怎么设计?可能是直接暴力的根据ind…

CentOS 7 Linux 的初始化系统(系统服务管理和控制程序/Init System) -- systemd 详解

文章目录一、systemd 的由来(一)常用的 init 系统(二)init 程序的缺点(三)systemd 简介(四)systemd 架构图二、服务管理三、unit 配置文件(一)概述&#xff0…

python 指针指向的内容,python-文件的读取及指针位置

文件的读取及指针位置打开文件的三步:打开->操作->关闭文件的读取:f open(/tmp/passwd)打开f.close()操作完,关闭文件判断文件对象拥有的权限print(f.readable())是否拥有可读权限True or Falshprint(f.writable())是否拥有可写权限文…

jax-rs jax-ws_对状态代码使用JAX-RS异常

jax-rs jax-ws从JAX-RS资源发送特定HTTP(错误)状态代码的一种方法是使用javax.ws.rs.core.Response类及其类似Builder Pattern的API。 如果要根据响应主体指定返回类型,则仍然可以这样做,并通过抛出WebApplicationException针对错…

Linux 及其它类 Unix 系统的系统服务管理和控制程序(初始化系统/init system)简单梳理

文章目录一、Linux 的启动过程二、初始化程序(一)System V init(二)Upstart init(三)systemd(四)Launchd(五)Epoch(六)Mudar一、Linux…

matplotlib 柱状图_Matplotlib数据可视化:柱状图与直方图

↑↑点击上方蓝字,回复资料,嘿嘿,10个G的惊喜柱状图和直方图是两种非常类似的统计图,区别在于:直方图展示数据的分布,柱状图比较数据的大小。直方图X轴为定量数据,柱状图X轴为分类数据。因此&am…

php怎样完成批量审核,CMS_DedeCMS 批量取消审核文档的实现方法,今天修改了几个地方的代码 实 - phpStudy...

今天修改了几个地方的代码 实现了在原来dede文章批量管理的地方 添加一个 “取消审核” 如下图:实现方法:修改管理目录(默认为dede)下的文件:archives_do.php 插入以下代码(位置随意 可以放审核文档下面 方便记忆):复制代码代码如…

groovy.run 脚本_Picocli 2.0:类固醇上的Groovy脚本

groovy.run 脚本Picocli 2.0增加了对其他JVM语言(尤其是Groovy)的支持。 当Groovy语言具有CliBuilder类的内置CLI支持时,为什么还要使用picocli? 您可能喜欢picocli的使用帮助,默认情况下会显示ANSI 颜色和样式 。 您…

Linux 系统服务管理和控制程序(初始化系统/Init System) -- systemd 介绍

文章目录systemd 简介systemd 启动过程概述Systemd的争议systemd 简介 开发systemd的主要目的就是减少系统引导时间和计算开销。systemd(系统管理守护进程),最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,…

mongodb msi安装包_跟我快速学数据存储:MongoDB非关系型数据库

想要学习更多编程,就点上方蓝字关注我们MongoDB概述01与Redis半持久化,存储于内存和硬盘不同,MongoDB是直接持久化,存储于硬盘的缓存系统。MongoDB非常流行,其中阿里云提供了云数据库MongoDB版。https://blog.csdn.net…

php页面 info,通过PATH_INFO方法实现页面伪静态_php

/*函数url_parse用于解析url,使用时需要在前面定义define(PATH_INFO,true);需要解析时调用该函数,取值方法用回$_GET[xxx]即可*/function url_parse(){if(!(isset($_SERVER[PATH_INFO])&&defined(PATH_INFO))){return;}$url substr($_SERVER[PA…

767 重构字符串_重构字符串型系统

767 重构字符串去年,我加入了一个项目,该项目从另一个软件公司接手,但未能满足客户需求。 如您所知,在“继承”的项目及其代码库中,有许多事情可以并且应该加以改进。 可悲的是(但并不奇怪)领域…

fanuc roboguide_FANUC机器人虚拟仿真教程:Roboguide弧焊仿真工作站工装添加

Roboguide软件左侧浏览树中的“Fixture”节点专门用于添加工装资源,软件支持添加自带的库文件数模以及外部导入的CAD数模。软件支持CSB、DXF、STL、IGES、3DS等格式数模文件,一般情况下将将外部数模转换为IGES或CSB格式后进行导入效果会更好一些。本期&a…

如何在 Ubuntu 14.04 和 12.04 上测试 systemd

本来,Ubuntu决定从Ubuntu 16.04 LTS开始使用systemd来替换当前的引导过程。Ubuntu 16.04预计在2016年4月发布,但是考虑到systemd的流行和需求,刚刚发布的Ubuntu 15.04采用它作为默认引导程序。另外,Ubuntu 14.04 Trusty Tahr和Ubu…

oracle怎么读取表空间文件大小,oracle获取表空间文件大小

oracle通过查询DBA_SEGMENTS表获取表空间文件信息,包括表空间名称,大小等 ? 1 select tablespace_name,sum(max_size),sum(bytes) from dba_segments group by tablespace_name; max_size和bytes的单位是字节。将上面的sql语句放到存储过程中执行&#…

java 枚举内嵌枚举_高度有用的Java ChronoUnit枚举

java 枚举内嵌枚举几年前,我发表了博客文章“ The Highly有用的Java TimeUnit Enum ”,其中介绍了JDK 5引入的TimeUnit枚举。 JDK 8引入了一个更新的枚举ChronoUnit ,它比TimeUnit更适合于并发以外的上下文(例如日期/时间操作&…

Chrome for Mac OS 的 快捷键

文章目录页面滚动其它页面滚动 快捷键功能说明Command ↑滚动到网页的顶部Command ↓滚动到网页的底部 其它 快捷键功能说明Shift Command [ 或 Shift Command ]左右切换标签页,到最后一个会重新循环Option Command ← 或 Option Command →左右切换标签页…

oracle分页包,Oracle分页获取数据的实现 (包和存储过程)

本文档主要是介绍针对oracle数据库中利用包和存储过程来实现分页获取数据的内容。其实该存储过程的主题思想及主要实现我也是从网上找的,自己做了整合。包括包头声明和包体实现部分以及C#代码具体调用部分,共大家参考并提出改进意见。本包中包括两个分页…

python-opencv 最快的遍历颜色空间_居住空间设计的七种设计风格

生活中每家每户的家居样式都是不一样的,它们都是各有各的风格。在居住空间设计中,设计师会根据居住者的风格喜好来定制相应的设计方案,以及融入设计师的风格特点来创造出独特的设计风格,那么让我看看都有哪些设计风格吧。传统风格…

java更好的语言_五个使Java变得更好的功能

java更好的语言我偶然发现了Brian Goetz 提出的有关Java数据类的建议 ,立即意识到我也对如何使Java更好地成为一种语言有一些想法。 我实际上有很多,但这只是五个最重要的简短列表。 专制(2006),迈克贾奇(…