Как стать автором
Обновить

Комментарии 19

Это невозможно из-за того, что методы не могут быть одновременно статическими и абстрактными.

Но ведь статический метод может быть перекрыт таким же статическим методом наследника.

Не может. Статический метод не наследуется, т.к. привязан к конкретному классу. В классе-наследнике можно определить статический метод с такой же сигнатурой, но этот метод не будет иметь ничего общего с предком.

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

Таким образом можно было бы показать его реализацию

Что значит "показать реализацию"?

В пределах Enum его нельзя реализовать, потому что для него этот метод не имеет смысла. И его наличие там никакой пользы не принесёт, т.к. обращение непосредственно к нему - бессмысленно, а обращение к его тёзке в конкретном enum'е отношения к нему иметь никакого не будет.

Автор желается ознакомиться с их контрактом. Можно было бы их объявить, заполнив фиктивным содержимым, объясняющим работу как-то.

В конкретном enum-e метод был бы перекрыт.

Так, ещё раз, а какой в этом смысл?

Зачем добавлять метод, который никогда не должен использоваться и не имеет смысла? Причём, более того, который даже не является примером для разработчика, как писать подобный, потому что:

  • его даже в общих чертах нельзя описать в Enum

  • разработчик итак никогда его не должен (и не сможет) реализовать, потому что вручную от Enum наследоваться нельзя

В итоге наличие такого метода вводило бы лишь в заблуждение.

Так, ещё раз, а какой в этом смысл?

Практического - никакого. Автор этой статьи смог бы ознакомиться с контрактом.

Но какой в этом смысл? Для самого Enum его нельзя корректно определить (= он бессмысленен); а при "перекрытии" у нас просто будет идентичный по названию и сигнатуре, но, в общем, никак не связанный с предыдущим, другой метод
.

Именно, что "перекрыт". Статические методы не полиморфны в java.

Ещё можно добавить, что enum (учитывая его особенность инициализации) часто используют для реализации потокобезопасного синглтона.

Ага, еще Джошуа Блох писал, что

... single-element enum type is often the best way to implement a singleton.

Правда я не уверен, что кто-либо хочет видеть в своих синглтоновых классах методы valueOf(), values(), compareTo() , ordinal() и т.д.
Ради интереса я даже пытался найти хотя бы один синглтон на основе enum в стандартной библиотеке Java, но не нашел.

Кстати, в Котлине не стали пользоваться рекомендацией Блоха и у них object разворачивается в обычный класс с одной внутренней статической константой. Сам класс от `java.lang.Enum` не наследуется

Чуть позже Блох передумал :).

пытался найти хотя бы один синглтон на основе enum в стандартной библиотеке Java

В стандартной тоже не видел, но в гугловой гуаве полно. Только там использование хитрое, чтобы не было доступа у вызывающего кода к стандартным enum-овым методам.

ничего нового, но статья хорошая. Спасибо

Информативная статья. Большое спасибо!

Но какая же у них реализация? В JLS она не приведена, и в исходниках JDK ее тоже не найти.

Нужно только захотеть и можно отыскать эти методы.

Обратите внимание, что по первой ссылке приведен метод valueOf() с двумя аргументами, а не с одним. В статье же речь шла про valueOf() с одним аргументом. О существовании valueOf() с двумя аргументами было написано чуть выше процитированного отрывка.


По второй ссылке также приведен не тот метод, про который написано в статье - getEnumConstants() вместо values().

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

К слову, получить массив всех членов перечисления можно и с помощью ParticularEnum.class.getEnumConstants(), правда, этот способ и длиннее, и немного медленнее.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории