Есть ли причины, по которым EnumMap и EnumSet не являются судоходными

Enum is Comparable, что означает, что вы можете иметь

NavigableSet<AccessMode> modes = new TreeSet<>();
NavigableMap<AccessMode, Object> modeMap = new TreeMap<>();

Они имеют время доступа O (ln N).

Коллекции Enum имеют O (1) время доступа, но не являются навигационными

NavigableSet<AccessMode> modes = EnumSet.noneOf(AccessMode.class); // doesn't compile
NavigableMap<AccessMode, Object> modeMap = new EnumMap<>(AccessMode.class);  // doesn't compile

Мне было интересно, была ли причина того, что коллекции Enum не были Navigable (и отсортированы). i.e Я что-то пропустил?

Ответ 1

Моя лучшая догадка заключается в том, что навигационная способность не рассматривалась как основной прецедент для наборов перечислений. В реализации нет ничего, что могло бы предотвратить навигацию. Редкие случаи использования, которые сочетают необходимость набора элементов перечисления с навигацией, покрываются TreeSet и TreeMap.

Ответ 2

Многие "очевидные" функции отсутствуют в JDK и его различных API. Почему эта особенность была опущена/забыта? Мы можем только догадываться. Но ваш вопрос был RFE на Sun/Oracle в течение длительного времени:

Вы можете поддержать эти RFE, комментируя их. Обратите внимание, что здесь авторитетный ответ Джошуа Блоха по этому вопросу:

Я смутно вспоминаю об этом, но не могу вспомнить, явно отклонил его с полным основанием. Мы бежали очень низко когда я реализовал EnumSet и EnumMap, и возможно, что время сыграло свою роль в нашем решении

http://comments.gmane.org/gmane.comp.java.jsr.166-concurrency/2158

Так даже он должен был догадаться: -)

Ответ 3

Сообщение не отвечает непосредственно на вопрос, ни попытки, он просто передает, почему Navigable был представлен

Опубликовать, поскольку мне было предложено (и это слишком долго для комментария)

Короткий ответ заключается в том, что Navigable существует, потому что у нас не было что-то вроде предстоящих "защитников" - "Сортировка" не описывала все общей функциональности, и не было никакого способа сделать это, кроме как ввести новый интерфейс. На практике я уверен, что "Сортировка" по-прежнему используется гораздо чаще, чем "Navigable" в качестве типа объявления, потому что большинству людей не нужны методы, определенные в навигационном, но не Критерий сортировки. Плюс "Navigable" - это просто не очень приятное имя: -)

-Doug