Зачем нам нужны Set и Map для Java Enum

Я новичок в Энуме. Пока я изучаю Enum, я наткнулся на EnumSet и EnumMap. Я понимаю, что при работе с картой и набором использование EnumSet и EnumMap намного лучше, чем аналоги хеширования из этого вопроса.

Почему EnumSet или EnumMap могут быть более производительными, чем их хешированные аналоги?

мой вопрос

В каких сценариях нам нужны Map и Set для Enum в Java?

Меня больше интересует знание практических сценариев.


person mvg    schedule 31.12.2014    source источник
comment
Когда вам нужны именованные флаги, вам нужен EnumSet (намного лучше для чтения, чем, например, использование ints и битовой магии). Если вы хотите присвоить значения или значения по умолчанию/функции значениям перечисления, вам понадобится EnumMap.   -  person Gábor Bakos    schedule 31.12.2014
comment
Ваш вопрос не кристально ясен. Вы хотите знать о сценариях, в которых EnumMap и EnumSet предпочтительнее, чем HashMap и HashSet, или вы спрашиваете, когда следует использовать EnumMap, а когда EnumSet (допустим, потому что вы их путаете)?   -  person Pshemo    schedule 31.12.2014
comment
Я просто хочу знать, почему и когда нам нужна коллекция (карта и набор) для перечисления. Извините, если мой вопрос сбивает с толку.   -  person mvg    schedule 31.12.2014
comment
Поскольку EnumMap и EnumSet лучше, вы можете использовать их всякий раз, когда можете.   -  person Peter Lawrey    schedule 31.12.2014
comment
Мой вопрос: зачем нам набор или карта для Enum?   -  person mvg    schedule 31.12.2014
comment
...Непонятно, что вы имеете в виду. Вы понимаете, когда вам нужны карты и наборы вообще? Это только те случаи, за исключением случаев, когда значения являются перечислениями...   -  person Louis Wasserman    schedule 31.12.2014
comment
Я понимаю карты и наборы в целом. Мы можем использовать его для сбора данных, размер и значения которых неизвестны в основном во время компиляции. Но значения перечисления предопределены во время его создания. Так зачем нам для этого нужна коллекция?   -  person mvg    schedule 31.12.2014
comment
Вы можете пересекать EnumSets или добавлять к ним новые значения, чтобы они не были константами. Точно так же вы можете присвоить новые значения существующим ключам для EnumMaps или добавить, удалить пары ключ/значение.   -  person Gábor Bakos    schedule 31.12.2014
comment
@mvg: вы знаете все возможные значения перечисления во время компиляции, но вы не обязательно знаете, какую их комбинацию вы хотите использовать во время выполнения. Возможно, это подмножество возможных значений перечисления, считываемых из файла конфигурации, или вы манипулируете подмножеством дней недели.   -  person Louis Wasserman    schedule 31.12.2014


Ответы (1)


Рассмотрим сценарий, в котором вы определяете вес для каждого объекта формы, например:

public enum SHAPE {
    TRIANGLE, RECTANGLE, SQUARE, HEXAGON;
}

И давайте предположим, что создание объектов для всех этих форм всегда огромно. Скажем, он входит в БД и извлекает некоторые данные, скажем, в конструкторе. Что ты делаешь?

Вы сохраняете его на карте, используя ключ и значение перечисления как один временной объект, а затем, используя перечисление, вы говорите, попробуйте и вызовите что-то вроде:

public double calculateArea(SHAPE shape) {
    Figure figure = map.get(shape);//you dont create object but take it from a map
    return figure.calculate();
}

Для EnumSet предположим, что у вас есть перечисление с основными цветами, такими как:

enum COLORS {
    RED, BLUE, GREEN
}

Теперь, если я хочу создать, скажем, ЖЕЛТЫЙ цвет и узнать ИНГРЕДИЕНТЫ для него, я мог бы использовать EnumSet с двумя цветами, такими как ЗЕЛЕНЫЙ и КРАСНЫЙ. Точно так же я мог бы хранить несколько наборов с вариациями в соответствии с моими требованиями к цвету.

Это просто для примера, но вы можете даже добавить счетчик, чтобы было сложнее сказать, сколько вариаций КРАСНЫХ, СИНИХ и ЗЕЛЕНЫХ пикселей вам нужно.

person SMA    schedule 31.12.2014
comment
Спасибо. Рад, что это помогло. - person SMA; 31.12.2014
comment
Я понимаю, что Enum — это набор констант, и вы говорите, что EnumSet является частью этого набора — подколлекции. Правильный? - person mvg; 31.12.2014
comment
Да, он расширяет AbstractSet. - person SMA; 31.12.2014