Комментарии 19
Это невозможно из-за того, что методы не могут быть одновременно статическими и абстрактными.
Но ведь статический метод может быть перекрыт таким же статическим методом наследника.
Не может. Статический метод не наследуется, т.к. привязан к конкретному классу. В классе-наследнике можно определить статический метод с такой же сигнатурой, но этот метод не будет иметь ничего общего с предком.
Собственно, именно поэтому вызов статического метода на экземпляре объекта вместо класса считается говнокодом и должно быть заменено на вызов через имя класса.
Таким образом можно было бы показать его реализацию
Что значит "показать реализацию"?
В пределах Enum
его нельзя реализовать, потому что для него этот метод не имеет смысла. И его наличие там никакой пользы не принесёт, т.к. обращение непосредственно к нему - бессмысленно, а обращение к его тёзке в конкретном enum'е отношения к нему иметь никакого не будет.
Автор желается ознакомиться с их контрактом. Можно было бы их объявить, заполнив фиктивным содержимым, объясняющим работу как-то.
В конкретном enum-e метод был бы перекрыт.
Так, ещё раз, а какой в этом смысл?
Зачем добавлять метод, который никогда не должен использоваться и не имеет смысла? Причём, более того, который даже не является примером для разработчика, как писать подобный, потому что:
его даже в общих чертах нельзя описать в
Enum
разработчик итак никогда его не должен (и не сможет) реализовать, потому что вручную от
Enum
наследоваться нельзя
В итоге наличие такого метода вводило бы лишь в заблуждение.
Но какой в этом смысл? Для самого Enum
его нельзя корректно определить (= он бессмысленен); а при "перекрытии" у нас просто будет идентичный по названию и сигнатуре, но, в общем, никак не связанный с предыдущим, другой метод
.
Именно, что "перекрыт". Статические методы не полиморфны в java.
В .net ограниченно пытаются завести static abstract для интерфейсов: https://habr.com/ru/post/572902/
Ещё можно добавить, что enum (учитывая его особенность инициализации) часто используют для реализации потокобезопасного синглтона.
Ага, еще Джошуа Блох писал, что
... single-element enum type is often the best way to implement a singleton.
Правда я не уверен, что кто-либо хочет видеть в своих синглтоновых классах методы valueOf()
, values()
, compareTo()
, ordinal()
и т.д.
Ради интереса я даже пытался найти хотя бы один синглтон на основе enum
в стандартной библиотеке Java, но не нашел.
Кстати, в Котлине не стали пользоваться рекомендацией Блоха и у них object
разворачивается в обычный класс с одной внутренней статической константой. Сам класс от `java.lang.Enum`
не наследуется
ничего нового, но статья хорошая. Спасибо
Обратите внимание, что по первой ссылке приведен метод valueOf() с двумя аргументами, а не с одним. В статье же речь шла про valueOf() с одним аргументом. О существовании valueOf() с двумя аргументами было написано чуть выше процитированного отрывка.
По второй ссылке также приведен не тот метод, про который написано в статье - getEnumConstants() вместо values().
Загадки Enum'ов