Почему Java не предоставляет доступ к объектам класса enum для EnumSet и EnumMap?

EnumSet имеет личное поле для класса значения. Почему бы не предоставить публичный доступ?

Также, EnumMap имеет закрытые поля для классов ключей и значений. Тот же вопрос.

Для непустых наборов / карт можно выполнить итерацию первого элемента и извлечь класс из ненулевого значения. Однако для пустых наборов / карт это невозможно.

2 ответа

Причина, по которой нет метода-получателя для класса члена EnumSet ни для ключевого класса EnumMap в том, что для эффективного использования этих классов статический тип обычно известен и используется программистом, а тип Class может быть легко получено из имени типа, используя литерал класса.

Например, рассмотрим следующее перечисление:

enum Direction { NORTH, EAST, SOUTH, WEST }

Вы бы использовали это так:

Set<Direction> wittsEnd = EnumSet.of(NORTH, EAST, SOUTH); // hint: don't go west

Чтобы добавить, удалить или проверить членство в этом наборе, мы обычно имеем Direction пример. Если мы хотим создать новый набор или извлечь его из существующего набора, мы объявили бы переменную типа Set<Direction>, Если мы хотим Class объект, соответствующий типу перечисления, мы просто используем Direction.class, Таким образом, как правило, нет необходимости получать Class объект из EnumSet сам.

Аналогичные рассуждения относятся к EnumMap,

Я предполагаю, что может быть какой-то случай, когда у кого-то есть EnumSet<?> и вы хотите создать набор из всех или ни одного из значений перечисления, что требует Class объект для типа, не известного во время компиляции. Такой случай казался бы довольно надуманным. Для таких случаев, однако, можно использовать эту в равной степени надуманную технику (т.е. взломать), чтобы получить класс enum для некоторого неизвестного EnumSet s:

Class<? extends Enum<?>> enumClass =
    EnumSet.copyOf(s).addAll(EnumSet.complementOf(s)).iterator().next().getClass();

Подобная техника, вероятно, может быть использована для получения ключевого класса EnumMap,

EnumSet имеет приватное поле для класса значений. Почему бы не предоставить публичный доступ?

Я не могу думать о технической причине не делать этого. Однако я также не могу придумать убедительного варианта использования, который требует этого.

Но, в конечном счете, ответ на ваши вопросы заключается в том, что это было решение, принятое дизайнерами Java, и только они могут объяснить фактическое обоснование решений.

Другие вопросы по тегам