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

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

(Это похоже на предыдущий предыдущий question)

Ответы

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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