2012-03-24 47 views
2

首先,我不問一個包裝的問題,使包裝只讀,比如Collections.unmodifableXXX。我的API會有一個不同的API,所有的修改器方法都會返回新的集合。不可變的集合,當修改後返回一個新的視圖

類似於簡單列表的東西不再具有void set方法,但會返回一個新List。

理想情況下,該軟件包將包含List,Set,Map甚至無聊堆棧的相同不變變體。

UPDATE

// i am omitting generics etc to keep things simple. 
XList list = List.fromArray(1, 2, 3); 
XList list2 = list.add(4); 

System.out.println(list); // 1, 2, 3 
System.out.println(list2); // 1, 2, 3, 4 

中移除了,套等所有更新內容等後返回不同的列表

+1

你有沒有想過使用[Scala的](http://www.scala-lang.org/api/current/scala/collection/immutable/List.html)?不知道這將如何在Java中氾濫...... – 2012-03-24 01:40:25

+0

您所描述的內容稱爲「寫時複製」。 – 2012-03-24 01:44:11

+0

@jimGarrison im問實例保持不變,你實際上描述COW如何在內部關於支持數組的工作。 – 2012-04-22 22:16:33

回答

1

你所描述被稱爲「寫入時複製」,和Java有這樣的集合的兩個實現:CopyOnWriteArrayListCopyOnWriteArraySet

+0

科瓦爾和COWAS不與變化返回一個新的實例。這使得它不可能用於持有之前和之後的版本。 – 2012-03-25 10:26:15

2

其實,我覺得OP被描述的功能集合API。這可以使用寫入時複製來實現,但關鍵的區別在於API設計本身。

我找不到像這樣工作的替代Java集合框架。這並不是說你不能寫一個...

(標準的Java寫拷貝集合是可變的,並且在大多數方面表現得像「普通」集合一樣,使用copy-這些類中的寫入機制是允許併發迭代和修改,並且減少了具有大量線程爭用的共享集合上的同步開銷。)

0

Clojure programming language(編譯爲Java字節代碼,運行在JVM上,與Java完全互操作)具有您正在尋找的完全語義的集合。

這裏的描述Clojure的數據結構背後的一般原則的概述頁面:http://clojure.org/data_structures

雖然Clojure中有自己的Lisp語言的語法,它的大部分庫函數的Java實現。例如,Clojure列表由PersistentList.java定義。你可以在任何Java程序中導入和使用這個類。 Clojure有類似的套,地圖等類...

+0

目前這幾乎是一個合適的答案。 – 2012-03-25 10:28:18

0

你不能在香草集合框架,因爲例如, Collection.add(Object)指定爲返回boolean,並且您不能覆蓋它以替代返回新的Collection

您可能會嘗試Functional Java中的數據結構。

+0

我知道在JVM上其他LANGS也有類似的收藏,但我希望留在Java的土地。 – 2012-03-25 10:26:58

+0

'功能Java'不是另一種語言,據我所知 - 它只是一個Java庫。 – 2012-03-25 22:21:35

相關問題