Когда использовать Enum или Collection в Java
При каких обстоятельствах перечисление более уместно, чем, например, Collection, который гарантирует уникальные элементы (реализатор java.util.Set, я полагаю...)?
(Это своего рода продолжение моего предыдущего вопроса)
6 ответов
В основном, когда это четко определенный, фиксированный набор значений, которые известны во время компиляции.
Вы можете использовать enum как набор очень легко (с EnumSet), и это позволяет вам определять поведение, ссылаться на элементы по имени, включать их и т. Д.
Когда элементы известны заранее и не изменятся, перечисление подходит.
Если элементы могут измениться во время выполнения, используйте Set.
Я не гава-гуру, но я предполагаю использовать перечисление, когда вы хотите гарантировать определенный пул значений, и использовать коллекцию, когда вы хотите гарантировать уникальность. Примером может быть перечисление дней недели (не может иметь "funday") и получение коллекции SSN (общий пример, который я знаю!)
Отличные ответы - я постараюсь обобщить, если только для моей справки - похоже, что вы должны использовать перечисления в двух ситуациях:
Все необходимые вам значения известны во время компиляции, а также одно или оба из следующих:
- Вы хотите лучшую производительность, чем ваши обычные реализации коллекции
- вы хотите ограничить потенциальные значения теми, которые указаны во время компиляции
С помощью ссылок "Коллекция поверх перечисления", которые дал Джон, вы можете получить преимущества производительности и безопасности перечисления в качестве детали реализации, не включая ее в свой общий дизайн.
Сообщество Wiki'd, пожалуйста, редактируйте и улучшайте, если хотите!
В некоторых ситуациях ваш бизнес требует создания новых элементов, но в то же время бизнес-логика основана на некоторых фиксированных элементах. Для фиксированных, которые вы хотите перечислить, новые, очевидно, требуют некоторой коллекции / DB.
Я видел проекты, использующие коллекцию для такого рода элементов, в результате чего бизнес-логика зависит от данных, которые могут быть удалены пользователем. Никогда не делайте этого, но создайте отдельное перечисление для фиксированных и коллекцию для остальных, как требуется.
Другое решение - использовать коллекцию с неизменяемыми объектами для фиксированных значений. Эти элементы также могут находиться в БД, но имеют дополнительный флаг, поэтому пользователи не могут обновить / удалить его.