在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.Set和java.util.Map接口的Javadoc注釋也得到類似的處理。
到目前為止,我主要集中于如何增強Javadoc文檔以及如何將術語從“不變”更改為“不可修改”。 但是,在這里值得指出的是,術語的這種變化與新的“復制工廠方法”和新的收集器的添加有關,這將使訪問不可修改的收集變得更加容易。 JDK-8191517總結了這些新方法:
- “向java.util.List , Set和Map添加一族copyOf()方法,以復制現有集合或Map中的元素。”
- “將一組收集器添加到java.util.stream.Collectors ,這些收集器將從流中創建不可修改的List , Set或Map 。”
即將到來的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中不可变与不可修改的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中单小鱼人符文天赋符文天赋加点图s6(新
- 下一篇: 苹果电脑显示器主机接口(苹果台式外接显示