Неизменяемые коллекции, которые возвращают новый вид при изменении - PullRequest
2 голосов
/ 24 марта 2012

Во-первых, я не задаю вопрос об оболочке, которая делает упаковку доступной только для чтения, такой как 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

удаляет, устанавливает и т.д.*

Ответы [ 5 ]

2 голосов
/ 24 марта 2012

На самом деле, я думаю, что ОП описывает API функциональных коллекций. Это может быть реализовано с использованием копирования при записи, но ключевое отличие заключается в самом дизайне API.

Я не смог найти альтернативную структуру Java-коллекций, которая работает следующим образом. Нельзя сказать, что вы не могли написать один ...

(Стандартные коллекции Java для копирования при записи являются изменяемыми и во многих отношениях ведут себя как «обычные» коллекции. Цель использования механизма копирования при записи в этих классах состоит в том, чтобы обеспечить одновременную итерацию и модификацию, и уменьшает накладные расходы на синхронизацию в общих коллекциях с большим количеством конфликтов потока.)

1 голос
/ 24 марта 2012

То, что вы описываете, называется «копирование при записи», и Java имеет две реализации таких коллекций: CopyOnWriteArrayList и CopyOnWriteArraySet

0 голосов
/ 24 марта 2012

Вы не можете сделать это в рамках vanilla Collections, потому что, например, Collection.add(Object) указано для возврата boolean, и вы не можете переопределить его для возврата нового Collection.

Вы можете попробовать структуры данных в Функциональная Java , возможно.

0 голосов
/ 24 марта 2012

Язык программирования Clojure (который компилируется в байт-код Java, работает на JVM и полностью совместим с Java) содержит коллекции с именно той семантикой, которую вы ищете.Вот обзорная страница, описывающая общий принцип, лежащий в основе структур данных Clojure: http://clojure.org/data_structures

Хотя Clojure имеет свой собственный Lisp-подобный синтаксис, большинство его функций библиотеки реализованы на Java.Например, списки Clojure определяются как PersistentList.java .Вы можете импортировать и использовать этот класс в любой программе Java.Clojure имеет похожие классы для наборов, карт и т. Д. *

0 голосов
/ 24 марта 2012

Как насчет использования копии при записи коллекций из Java 5?

http://www.javamex.com/tutorials/synchronization_concurrency_8_copy_on_write.shtml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...