Когда использовать Enum или Collection в Java

При каких обстоятельствах перечисление является более подходящим, чем, например, коллекция, которая гарантирует уникальные элементы (я думаю, реализация java.util.Set...)?

(Это своего рода продолжение моего предыдущего вопрос)


person brabster    schedule 26.01.2009    source источник
comment
Интересны ответы на связанный вопрос в Programmers Stack Exchange: Хорошо ли использовать List of Enums?   -  person Basil Bourque    schedule 23.01.2016


Ответы (6)


В основном, когда это четко определенный фиксированный набор значений, которые известны во время компиляции.

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

person Jon Skeet    schedule 26.01.2009
comment
Спасибо за эту ссылку на EnumSet - пропустил это раньше. - person brabster; 26.01.2009
comment
Я никогда раньше не видел EnumMap, хотя часто использую EnumSet! - person Jon Skeet; 26.01.2009
comment
Да, я только в прошлом году наткнулся на EnumMap. Хороший класс. - person cletus; 27.01.2009
comment
@JonSkeet- Сэр, как вы думаете, миру .net все еще нужно учиться у братьев из мира Java ?? - person Perpetualcoder; 27.01.2009
comment
@Perpetualcoder: Абсолютно, когда дело доходит до перечислений. Перечисления Java намного лучше, чем перечисления C#/.NET. - person Jon Skeet; 27.01.2009

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

Если элементы могут изменяться во время выполнения, используйте Set.

person duffymo    schedule 26.01.2009

Я не гуру Java, но я предполагаю, что использовать перечисление, когда вы хотите гарантировать определенный пул значений, и использовать коллекцию, когда вы хотите гарантировать уникальность. Примером может быть перечисление дней недели (не может быть "funday") и иметь набор SSN (общий пример, который я знаю!)

person Community    schedule 26.01.2009

Отличные ответы - я попытаюсь обобщить, хотя бы для себя - похоже, что вы должны использовать перечисления в двух ситуациях:

Все необходимые значения известны во время компиляции, а также одно или оба из следующих:

  • вам нужна лучшая производительность, чем ваши обычные реализации коллекций
  • вы хотите ограничить потенциальные значения значениями, указанными во время компиляции

С помощью ссылок Collection вместо enumeration, которые дал Джон, вы можете получить преимущества производительности и безопасности перечисления в качестве детали реализации, не включая ее в общий дизайн.

Сообщество вики, пожалуйста, редактируйте и улучшайте, если хотите!

person Community    schedule 26.01.2009
comment
Кроме того, одночленное перечисление делает отличный синглтон. Предполагая, что вы действительно хотите синглтон. - person Darron; 26.01.2009

Примечание: вы можете иметь оба с EnumSet.

person Peter Lawrey    schedule 26.01.2009

В некоторых ситуациях ваш бизнес требует создания новых элементов, но в то же время бизнес-логики на основе некоторых фиксированных элементов. Для фиксированных вам нужно перечисление, для новых, очевидно, требуется какая-то коллекция / БД.

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

Другое решение — использовать коллекцию с неизменяемыми объектами для фиксированных значений. Эти элементы также могут находиться в БД, но иметь дополнительный флаг, чтобы пользователи не могли его обновлять/удалять.

person Jurgen Hannaert    schedule 26.01.2009