在JDK 10中不可变与不可修改

大约两个月前, 斯图尔特·马克斯 ( 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

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

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

相关文章

@async方法不调用了_在Spring中使用Future对象调用Async方法调用

async方法不调用了下一个示例将演示Spring容器内部的异步方法调用。 为什么我们需要异步方法调用? 在某些情况下,我们并不真正知道是否需要重播或何时应返回结果。 传统方式在Java EE世界中处理异步调用的方法是使用队列/主题。 我们可以在Spring中进行相…

不同的休眠命名策略

本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后,我们将研究一下在休眠和配置中实施自定义…

基于FPGA,如何用Verilog HDL实现64位宽的扰码器?附上仿真结果。

文章目录前言一、扰码器1、什么是扰码器2、扰码的原理3、产生扰码的多项式二、Scrambler的Verilog实现1、scrambler.v2、scrambler_tb.v三、仿真结果四、总结前言 在数字信号处理系统中,因为发送端的数字信号序列可能会出现很长一段都是“0”,或很长一段…

基于FPGA,解扰码器Verilog的实现,以及扰码器与解扰码器的联合仿真。附上仿真结果。

文章目录前言一、扰码器二、解扰码器三、Descrambler的Verilog实现1、descrambler.v2、descrambler_tb.v四、扰码器与解扰码器的联合仿真1、scrambler_test.v2、scrambler_test_tb.v3、联合仿真结果五、总结前言 在数字信号处理系统中,因为发送端的数字信号序列可能…

光纤通信系统简介

文章目录前言一、直接检测光通信系统二、相干光通信系统三、直接检测与相干检测1、直接检测2、相干检测3、相干检测的优缺点(1)相干检测的缺点(2)相干检测的优点总结参考文献前言 光通信系统的基本组成结构如下图所示。光通信系统…

epyc rome_使用Encog,ROME,JSoup和Google Guava进行博客分类

epyc rome继续进行编程收集情报 ( Programming Collection Intelligence ,PCI),下一个练习是使用距离得分根据相关博客中使用的单词来确定博客列表。 我已经找到Encog作为AI /机器学习算法的框架,为此,我需…

重构字符串型系统

去年,我加入了一个项目,该项目接管了另一个未能满足客户需求的软件公司。 如您所知,在“继承”的项目及其代码库中,有许多事情可以并且应该加以改进。 可悲的是(但并不奇怪)领域模型就是这样一个孤零零&…

OFDM仿真程序,可直接运行,注释详细(没人注释比我还详细了)

OFDM仿真程序 clc clear allIFFT_bin_length128; %IFFT点数128个 carrier_count50; %子信道(子载波)数目 bits_per_symbol2; %4进制符号 symbols_per_carrier200;%每个子信道或者说子载波有200个符号 SNR0:1:40; for num1:41baseband_out_lengthcarrie…

Delta-Sigma调制(DSM)技术

前言 数字信号处理和通信系统的性能很大程度上受到了模拟信号到数字信号转换接口——ADC的精度和分辨率的限制。而传统的线性脉冲编码调制(PCM)ADC受到了制造工艺的限制,无法达到很高的分辨率。但基于Delta-Sigma调制技术的ADC可以在现有工艺…

无载波幅度和相位调制(CAP)与QAM调制的详细解析(可见光通信应用场景),以及CAP matlab程序下载链接

文章目录前言一、QAM调制?二、无载波幅度和相位调制(CAP)三、CAP调制与QAM调制之间的联系(异同点)四、CAP调制相比于QAM调制的优缺点4.1、优点4.2、缺点五、无载波幅度和相位调制matlab程序五、Reference前言 目前的通信系统中&a…

jpa 事务嵌套事务_JPA 2 | EntityManagers,事务及其周围的一切

jpa 事务嵌套事务介绍 对我来说,最令人困惑和不清楚的事情之一是,作为Java开发人员,一直是围绕事务管理的谜团,尤其是JPA如何处理事务管理。 事务什么时候开始,什么时候结束,实体的持久化方式,持…

Matlab中装载和存储实验数据的操作

一、装载实验数据 例如,以下程序,其中path是路径,strcat函数将后面的参数组合成一个字符串。load函数将由twoband_CAP4_400MBd_2000MSa_float_字符串与Tx.txt构成的: twoband_CAP4_400MBd_2000MSa_float_Tx.txt文件读取至matlab中。 numSam…

无服务器革命:好,坏和丑

“这是愚蠢的。 比愚蠢还糟:这是一场营销炒作。” ‐ 理查德斯托曼 ( Richard Stallman)对云计算的评论,2008年9月 而且,十年后,当有人提到这个词时,您开始三思而后行:是到天上掉的…

MATLAB中,信号的频谱图该怎么绘制?横坐标如何标注出频率值?

一、什么是频谱? 频谱的全称是频率谱密度。在对时域信号进行认识和研究的过程中非常不便,那我们该如何更直观地认识信号,更清楚地了解信号的特点呢? 利用傅里叶变换将时域信号变换到频域。 我们知道,在通信领域里傅…

Verilog HDL中模块参数传递的方法

文章目录前言一、参数传递二、参数传递方法1.方法一2.方法二3.方法三总结前言 “parameter”是Verilog HDL中的一个关键字,代表着参数型常量,即用parameter来定义一个标识符代表一个常量,这样可以提高程序的可读性与可维护性。 例如&#xf…

仔细看看_仔细看看,您会发现需要改进的地方

仔细看看我建议您做一个练习:明天早上返回工作时,浏览项目的源代码,并尝试寻找重构的机会。 即使老板没有要求也要这样做。 这样做是因为您想要一些激动人心的工作时间。 重构是改变已经可以正常工作的艺术 。 但是要进行重构,您…

Verilog HDL中位运算符、逻辑运算符和缩减运算符的区别

文章目录前言一、单目运算符、双目运算符和三目运算符二、位运算符三、逻辑运算符四、缩减运算符五、总结前言 我们在学习和理解Verilog HDL中的一些运算符的意义时,可能会对一些运算符的使用产生混乱,因此本文整理了Verilog HDL中&与&&、|…

Verilog HDL中容易生成锁存器的两种情况

在Verilog HDL的程序设计中,有两种情况会生成锁存器。 第一种情况 在always块中使用if语句,但是没有else,这会导致当条件不成立时,没有其他语句可执行,使得被赋值的寄存器一直保持不变,”锁存“住。 第二…

Spring Security与Maven教程

1.简介 在这篇文章中,我们将演示如何针对非常特定的用例将Maven依赖项用于Spring Security。 我们使用的所有库的最新版本都可以在Maven Central上找到。 在项目中,了解Maven依赖项的工作方式和管理方式对于有效的构建周期非常重要,并且对于…

EbN0、SNR、0.1nmOSNR的区别与联系

文章目录前言一、SNR与EbN0二、0.1nmOSNR1、波长宽度与带宽的换算2、0.1nmOSNR2.1、单极化信号2.2、双极化信号总结前言 无论是无线通信、光通信或者可见光通信系统中,我们经常会遇到信噪比的概念,但大多数,我们用的都是信号与噪声功率比&am…