[英]How deep would you expect the immutability of an immutable list to be?
如果你有一個不可變列表,你希望它總是在你要求的時候返回對同一個對象的引用
list.get(0)
我的問題是,您是否希望能夠改變對象並在下次從列表中獲取突變時反映出變異?
這取決於具體情況。 在通用庫中,我們應該假設列表是不可變的。 在列表中的元素的變化將反映到所有呼叫者,如每次返回相同的參考的直接后果。
但是,如果這是一個專門的不可變樹(或其他), 並且記錄如此,那么你會希望列表中的項本身是不可變的,這就成了一個沒有實際意義的問題。
如果不是關於列表的不變性,而是關於所包含對象的不變性的問題。
實際上,如果您有引用類型,則列表中的不可變實體是引用。 這意味着引用將始終相同。 現在引用的對象是否只發生變化取決於它是什么類型的對象。 如果對象是不可變的(例如,.NET和Java中的字符串,或.NET中的所有值類型),則對象不能更改。
否則,對象可以更改,並且對同一對象的所有其他引用將看到更改的狀態,因為它們包含對同一實例的引用。 因此,正如我在開頭所寫的那樣,這完全獨立於列表(以及它是否是不可變的)。
假設一家維修店想要保留所有曾經訪問過的汽車的永久附加記錄,這樣每輛車進入車主時都可以知道它是否曾經在車間。 哪個更好:
of a car, expressed by the VIN, is immutable. 請注意,汽車本身是一個可變對象,但由VIN表示的汽車的是不可變的。 完全可能的是,一輛汽車在參觀商店時是藍色的,因此被漆成了紅色。 因此,即使有人能夠輕松找到任何有VIN的汽車,汽車列表(VIN)以及他們在車間的時間也不允許人們確定上周四有多少輛藍色汽車在維修。 另一方面,如果列表的目的是讓人知道先前車輛是否已經進入車間,那么VIN列表正是人們所需要的。 如果不是擁有VIN,而是擁有一系列重復的汽車,那么創建和存儲所有這些復制汽車的成本不僅遠遠大於存儲VIN的成本,而且收集對於所述的收集幾乎是無用的。目的(確定某輛車之前是否曾訪問過)。
這通常是預料之中的。 該列表是不可變的,這意味着您無法在其中添加或刪除項目或完全替換項目。 如果您希望這些項目是不可變的,您必須自己處理。 一旦你得到對象的引用,該列表肯定無法阻止你改變對象的狀態。
是。
當我得到它們時,我不希望不可變列表克隆它的對象,除非它被記錄為這樣做。
是的,知道Java,對於一個“不可變的” List<T>
我不希望T是不可變的,除非T是不可變的。 但是,例如List<Date>
的合理實現是每次復制Date
。 問題是Date
是可變的,可以與其他相等的Date
區分開來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.