在JDK 10中不可变与不可修改
大約兩個月前, 斯圖爾特·馬克斯 ( Stuart Marks)寫道:“ 不變性就像葡萄酒 。” 然后,他提醒讀者注意叔本華的熵定律 :“如果將一勺酒倒入裝滿污水的桶中,就會產(chǎn)生污水。 如果將一勺污水倒入裝滿葡萄酒的桶中,就會產(chǎn)生污水。” 以此為背景,馬克將叔本華的熵定律應(yīng)用于不變性,用“不變性”代替“酒”,用“可變性”代替“污水”,以得出深刻見解:
同樣,如果在可變的東西上增加一點(diǎn)不變性,那么您將獲得可變性。 而且,如果您在不可變的內(nèi)容上添加一些可變性,那么您將獲得可變性。
此引用的上下文是自10月開始的在線討論,內(nèi)容涉及以JDK 10為目標(biāo)的JDK-8177290 (“為不可修改的列表,集合,映射添加復(fù)制工廠方法”)和JDK-8184690 (“為收集到不可修改的列表,集合添加添加收集器”)和地圖”)。 JDK-8177290是JDK-8156070 (“不可變集合”的增強(qiáng)功能)的子任務(wù),被描述為“用于不可變集合的各種增強(qiáng)和改進(jìn)子任務(wù)的容器”。 討論時間很長,涉及多種觀點(diǎn),而且常常涉及完全不同的觀點(diǎn),涉及諸如“不變”和“不可修改”之類的術(shù)語。 確實(shí),在討論的第一篇文章中,Mark寫道:“在涉及數(shù)據(jù)結(jié)構(gòu)時,術(shù)語“ 不變 ”與“ 持久性 ”密不可分,如果Java的“不變”意味著某種意義,我相信我們將永遠(yuǎn)對此進(jìn)行解釋。與其他人不同。”
最終確定要使用的術(shù)語的指針可以在與JDK-8191517相關(guān)的當(dāng)前文本中找到 (“為不可修改的列表,集合,映射添加復(fù)制工廠方法”)。 本文包含以下陳述:“為“視圖”集合,“不可修改”集合和“不可修改視圖”集合提供定義。” JDK-8191517還參考了webrev.4.zip和specdiff.4.zip,以獲取其他低級詳細(xì)信息。 這篇文章的其余部分將介紹那些引用的ZIP文件中記錄的一些低級詳細(xì)信息。
在引用的zip文件中添加到選擇接口的源代碼的Javadoc注釋包含有關(guān)術(shù)語“ 視圖集合 ”,“ 不可修改的集合 ”和“ 視圖 不可修改的集合 ”的其他詳細(xì)信息。 例如,用于java.util.Collection的Javadoc在其接口級Javadoc注釋中添加了以下描述:
- “ 查看集合 ” –“大多數(shù)集合管理它們所包含元素的存儲。 相比之下, 視圖集合本身并不存儲元素,而是依靠后備集合來存儲實(shí)際元素。 視圖集合本身未處理的操作將委托給后備集合。”
- 關(guān)于修改:“對后備集合所做的任何更改都可以在視圖集合中看到。
- “ 不可修改的集合 ” - “ 不可修改的Collection是一個集合,其所有mutator方法......被指定拋出UnsupportedOperationException異常。 因此,不能通過在其上調(diào)用任何方法來修改此類集合。 為了使一個集合正確地不可修改,從該集合派生的任何視圖集合也必須不可修改。”
- 關(guān)于修改:“不可修改的集合不一定是不變的。
- “ 修改視圖集合 ” - “ 不可修改視圖集合是一個集合,是不可修改的,并且也是一個視圖在背襯集合。 如上所述,它的mutator方法拋出UnsupportedOperationException},而將讀取和查詢方法委托給后備集合。 結(jié)果是提供對后備集合的只讀訪問。”
- 關(guān)于修改:“請注意,仍可能對支持集合進(jìn)行更改,并且如果發(fā)生更改,則可以通過不可修改的視圖看到它們。
上面的項(xiàng)目符號詳細(xì)介紹了添加到Javadoc中的java.util.Collection類的注釋,但是其他collection接口的Javadoc注釋也具有與這些特定接口相關(guān)的不變性和不可修改性的重要新注釋。 例如,先前引用的ZIP文件中顯示的java.util.List接口Javadoc注釋討論了“不可修改的列表”,可用于訪問此類List的便捷機(jī)制以及通過這些機(jī)制檢索的List的特征。 java.util.Set和java.util.Map接口的Javadoc注釋也得到類似的處理。
到目前為止,我主要集中于如何增強(qiáng)Javadoc文檔以及如何將術(shù)語從“不變”更改為“不可修改”。 但是,在這里值得指出的是,術(shù)語的這種變化與新的“復(fù)制工廠方法”和新的收集器的添加有關(guān),這將使訪問不可修改的收集變得更加容易。 JDK-8191517總結(jié)了這些新方法:
- “向java.util.List , Set和Map添加一族copyOf()方法,以復(fù)制現(xiàn)有集合或Map中的元素。”
- “將一組收集器添加到j(luò)ava.util.stream.Collectors ,這些收集器將從流中創(chuàng)建不可修改的List , Set或Map 。”
即將到來的Map.copyOf(Map)方法的Javadoc注釋指出:“返回包含給定Map條目的不可修改Map。 給定的Map不能為null,并且不得包含任何null鍵或值。 如果隨后修改了給定的地圖,則返回的地圖將不會反映出這些修改。” Javadoc注釋中一個有趣的(但并不奇怪)的“實(shí)施說明”指出:“如果給定的Map是不可修改的Map,則調(diào)用copyOf通常不會創(chuàng)建副本。” 使用Java 9添加到Map的許多重載Map.of()方法都對其Javadoc注釋進(jìn)行了修改,以將“ immutable”替換為“ unmodifiable”,并將對“ Immutable Map Static Factory Methods ”部分的引用替換為對新名稱的引用。該部分(“不可修改的地圖”)。 術(shù)語“結(jié)構(gòu)上不變的”也已由“不可修改的”代替。
該Set.copyOf(Collection)和List.copyOf(Collection)來的Java 10方法類似于在最后一段描述Map.copyOf(Map)其中包括在評論術(shù)語所提到的相同的更改Map 。
JDK-8191517對Java 10中的Collectors類的補(bǔ)充是toUnmodifiableList() , toUnmodifiableSet()的四個方法,以及toUnmodifiableMap(-)兩個重載版本(一個版本接受BinaryOperator參數(shù))。
隨著人們越來越普遍地實(shí)現(xiàn)不變性的優(yōu)點(diǎn),并且隨著Java開發(fā)人員努力在其應(yīng)用程序中更頻繁地應(yīng)用不變性,通常重要的是準(zhǔn)確地知道如何修改給定的結(jié)構(gòu),集合或視圖。 JDK 10計(jì)劃添加更多方法,以使Java開發(fā)人員更容易實(shí)現(xiàn)collection的不變性(或至少不可修改),并且對最重要的接口和Collections類的注釋應(yīng)有助于開發(fā)人員更清楚地了解什么是可變的以及他們?yōu)閼?yīng)用選擇的構(gòu)造中哪些是不可變的。
翻譯自: https://www.javacodegeeks.com/2018/01/immutable-versus-unmodifiable-jdk-10.html
總結(jié)
以上是生活随笔為你收集整理的在JDK 10中不可变与不可修改的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中单小鱼人符文天赋符文天赋加点图s6(新
- 下一篇: 不同的休眠命名策略