Когда использовать Enum или Collection в Java - PullRequest
24 голосов
/ 26 января 2009

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

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

Ответы [ 6 ]

27 голосов
/ 26 января 2009

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

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

5 голосов
/ 26 января 2009

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

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

3 голосов
/ 26 января 2009

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

2 голосов
/ 27 января 2009

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

2 голосов
/ 26 января 2009

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

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

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

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

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

0 голосов
/ 27 января 2009

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

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

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

...