Использование перечислений для реализации служебных классов и синглетонов - PullRequest
6 голосов
/ 14 февраля 2011

Питер Лори пишет о двух видах использования Enums, которые большинство людей забывают в своем блоге.

Прежде всего, я не забыл - я даже не понял:)

Эти подходы хороши и лаконичны - есть ли какие-либо преимущества, кроме краткости, по сравнению с более традиционными способами достижения того же самого, такими как использование final классов с конструкторами private для служебных классов?

Кроме того, есть ли какие-либо проблемы (кроме запутывающих программистов, которые этого не ожидают)?

Ответы [ 5 ]

8 голосов
/ 14 февраля 2011

Мне кажется более интуитивно понятным использовать enums для реальных перечислений.

4 голосов
/ 14 февраля 2011

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

Использование перечислений для синглетонов в служебных классах прекрасно, но я обычно стараюсь сохранить тот факт, что enum используется внутренняя деталь реализации.См., Например, класс Predicates в Guava, который использует enum для принудительного применения одного экземпляра некоторых Predicate, таких как alwaysTrue().Однако он не предоставляет пользователям enum.

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

2 голосов
/ 14 февраля 2011

Моим первым инстинктом в обоих случаях было то, что они были злобными хакерами.

Однако в случае синглтона я думаю, что вы могли бы обоснованно утверждать, что в языке, где константы enum являются объектами первого класса,концептуально нет разницы между синглтоном и перечислением только с одним значением.Я все еще не уверен, что на самом деле использовал бы эту технику, тем более что шаблон синглтона довольно непопулярен по другим причинам.

Использование enum для служебного класса труднее защищать.Нет никакой концептуальной причины для того, чтобы набор утилитарных методов был выражен как перечисление (возможно, нет никакой причины для того, чтобы они были выражены как класс, но это совсем другая дискуссия).Кажется, единственное оправдание для реализации служебных методов таким способом - немного сэкономить при наборе текста, игнорируя установленные соглашения.

1 голос
/ 14 февраля 2011

В дополнение к проблеме запутывания использования Enums для вещей, которые не являются перечислениями, использование Enums для синглетонов имеет те же недостатки, что и другие способы жесткого кодирования одноэлементной области, в основном это затрудняет тестирование и затрудняет наследование или другое расширение.Намного лучше, если фабрика, как в Spring, позволяет контролировать объем синглтона.

0 голосов
/ 14 февраля 2011

Мне не нравится этот подход.Перечисления должны быть простыми перечислениями действительно.Они должны содержать конверсионную логику не более.Использование enum в качестве синглтона или интерфейса выглядит для меня как запутанный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...