Класс, описывающий неизменный упорядоченный набор

Мне нужно какое-то имя класса/интерфейса, описывающее неизменяемый упорядоченный набор (в порядке ввода, например LinkedHashSet). Я могу, конечно, просто использовать класс следующим образом:

class Foo {
    public final Set<Long> frozenOrderedSet;

    public Foo(List<Long> input) {
        frozenOrderedSet = Collections.unmodifiableSet(new LinkedHashSet(input));
    }
}

Но это не прояснит мой подход. Я хотел бы дать понять всем, кто читает исходный код, что набор не поддается изменению и уникален, сохраняя при этом порядок с for(Long l : set){}.


person WorldSEnder    schedule 28.07.2014    source источник
comment
В порядке, указанном в SortedSet, или в порядке, указанном в LinkedHashSet?   -  person user2357112 supports Monica    schedule 29.07.2014
comment
Хорошо, вводите порядок. Я бы, наверное, выбрал LinkedHashSet в оболочке unmodifiableSet, но посмотрим, знает ли кто-нибудь еще что-нибудь более конкретное.   -  person user2357112 supports Monica    schedule 29.07.2014
comment
Guava предоставляет реализацию .   -  person Boris the Spider    schedule 29.07.2014
comment
Да, делайте, как говорит Джон Энтвистл, и используйте Guava.   -  person Mr. Polywhirl    schedule 29.07.2014


Ответы (3)


ImmutableSet в Guava предоставляет a high-performance, immutable Set with reliable, user-specified iteration order. Существуют также такие варианты, как ImmutableSortedSet. .

person Steven Schlansker    schedule 28.07.2014

Самый простой способ — расширить Set, чтобы создать собственный неизменяемый Set.

public CustomImmutableSet () { return Collections.unmodifiedSet (новый LinkedHashSet (вход)); }

Таким образом, всем, кто читает исходный код, будет ясно, что набор неизменяемый и уникальный.

person rupesh jain    schedule 28.07.2014

Божо в вопросе неизменяемые коллекции Java:

Неизменяемые коллекции обычно представляют собой представления (оболочки) других коллекций, доступные только для чтения. Вы не можете добавлять, удалять или очищать их, но базовая коллекция может измениться.

Неизменяемые коллекции вообще нельзя изменить — они не оборачивают другую коллекцию — у них есть свои элементы.

Вот цитата из ImmutableList гуавы

В отличие от Collections.unmodifiableList(java.util.List), который представляет собой представление отдельной коллекции, которая все еще может изменяться, экземпляр ImmutableList содержит свои собственные личные данные и никогда не изменится.

То есть, по сути, чтобы из изменяемой коллекции получить неизменяемую, нужно скопировать ее элементы в новую коллекцию и запретить все операции.

Итак, в основном вы можете создать подкласс класса TreeSet и переопределить все методы: добавить, удалить и т. д., чтобы просто выдать исключение, говорящее, что это неизменяемая коллекция. Также вам нужно будет создать конструктор копирования в этом классе с одним параметром TreeSet setToCopyFrom.

person Yoda    schedule 24.08.2014