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