簡體   English   中英

你期望不可變列表的不變性有多深?

[英]How deep would you expect the immutability of an immutable list to be?

如果你有一個不可變列表,你希望它總是在你要求的時候返回對同一個對象的引用

list.get(0)

我的問題是,您是否希望能夠改變對象並在下次從列表中獲取突變時反映出變異?

這取決於具體情況。 在通用庫中,我們應該假設列表是不可變的。 列表中的元素的變化將反映到所有呼叫者,如每次返回相同的參考的直接后果。

但是,如果這是一個專門的不可變樹(或其他), 並且記錄如此,那么你會希望列表中的項本身是不可變的,這就成了一個沒有實際意義的問題。

如果不是關於列表的不變性,而是關於所包含對象的不變性的問題。

實際上,如果您有引用類型,則列表中的不可變實體是引用。 這意味着引用將始終相同。 現在引用的對象是否只發生變化取決於它是什么類型的對象。 如果對象是不可變的(例如,.NET和Java中的字符串,或.NET中的所有值類型),則對象不能更改。

否則,對象可以更改,並且對同一對象的所有其他引用將看到更改的狀態,因為它們包含對同一實例的引用。 因此,正如我在開頭所寫的那樣,這完全獨立於列表(以及它是否是不可變的)。

假設一家維修店想要保留所有曾經訪問過的汽車的永久附加記錄,這樣每輛車進入車主時都可以知道它是否曾經在車間。 哪個更好:

  1. 保留每輛車的VIN(車輛識別號碼)的永久記錄
  2. 制作每輛車的副本(因為VIN必須是唯一的,必須具有與原件不同的VIN)並永久存儲重復的車輛。

of a car, expressed by the VIN, is immutable. 請注意,汽車本身是一個可變對象,但由VIN表示的汽車的是不可變的。 完全可能的是,一輛汽車在參觀商店時是藍色的,因此被漆成了紅色。 因此,即使有人能夠輕松找到任何有VIN的汽車,汽車列表(VIN)以及他們在車間的時間也不允許人們確定上周四有多少輛藍色汽車在維修。 另一方面,如果列表的目的是讓人知道先前車輛是否已經進入車間,那么VIN列表正是人們所需要的。 如果不是擁有VIN,而是擁有一系列重復的汽車,那么創建和存儲所有這些復制汽車的成本不僅遠遠大於存儲VIN的成本,而且收集對於所述的收集幾乎是無用的。目的(確定某輛車之前是否曾訪問過)。

這通常是預料之中的。 該列表是不可變的,這意味着您無法在其中添加或刪除項目或完全替換項目。 如果您希望這些項目是不可變的,您必須自己處理。 一旦你得到對象的引用,該列表肯定無法阻止你改變對象的狀態。

是。

當我得到它們時,我不希望不可變列表克隆它的對象,除非它被記錄為這樣做。

這實際上取決於你提出這個問題的背景。 任何有經驗的Java或C#開發人員都知道技術上幾乎不可能擁有一般的“深層不變性”,因此不會期望這樣。 在C ++中,這是一個非常復雜的主題 ,因此大多數開發人員可能也不期望可靠的深層不變性。 另一方面,D編程語言確實具有傳遞不變性的語言級概念 ,因此D程序員可能期望它在任何有意義的地方(這經常是)。

是的,知道Java,對於一個“不可變的” List<T>我不希望T是不可變的,除非T是不可變的。 但是,例如List<Date>的合理實現是每次復制Date 問題是Date是可變的,可以與其他相等的Date區分開來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM