Откуда берется метод 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 это такая же языковая особенность, как и класс для расширения.

Другие вопросы по тегам