Откуда берется метод Enum.valueOf(String)?
В Java SE 7 (и, скорее всего, в предыдущих версиях) класс Enum объявлен так:
public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>, Serializable
Класс Enum имеет статический метод с такой сигнатурой:
T static<T extends Enum<T>> valueOf(Class<T> enumType, String name)
Но нет статического метода: valueOf(String)
определено в классе Enum и не выше в иерархии, которой принадлежит Enum.
Вопрос в том, где valueOf(String)
родом из? Это особенность языка, то есть функция, встроенная в компилятор?
2 ответа
Этот метод неявно определяется компилятором.
Из документации:
Обратите внимание, что для определенного типа перечисления T неявно объявленный открытый статический метод T valueOf(String) для этого перечисления может использоваться вместо этого метода для сопоставления имени с соответствующей константой перечисления. Все константы типа enum могут быть получены путем вызова неявного открытого статического метода T[] values () этого типа.
Из спецификации языка Java, раздел 8.9.2:
Кроме того, если E является именем типа enum, то этот тип имеет следующие неявно объявленные статические методы:
/**
* Returns an array containing the constants of this enum
* type, in the order they're declared. This method may be
* used to iterate over the constants as follows:
*
* for(E c : E.values())
* System.out.println(c);
*
* @return an array containing the constants of this enum
* type, in the order they're declared
*/
public static E[] values();
/**
* Returns the enum constant of this type with the specified
* name.
* The string must match exactly an identifier used to declare
* an enum constant in this type. (Extraneous whitespace
* characters are not permitted.)
*
* @return the enum constant with the specified name
* @throws IllegalArgumentException if this enum type has no
* constant with the specified name
*/
public static E valueOf(String name);
Я думаю, что это должно быть особенностью языка. Во-первых, чтобы создать enum, сделав его, не нужно расширять Enum:
public enum myEnum { red, blue, green }
Это само по себе является языковой функцией, иначе вам нужно будет сделать это:
public class MyEnum extends Enum { ..... }
Во-вторых, метод, Enum.valueOf(Class<T> enumType, String name)
, должен быть произведен компилятором, когда вы используете myEnum.valueOf(String name)
,
Это то, что кажется возможным, учитывая, что новый Enum
это такая же языковая особенность, как и класс для расширения.