2012-08-11 25 views
22

En Java SE 7 (y muy probablemente en versiones anteriores) la clase de enumeración se declara así:¿De dónde viene el método Enum.valueOf (String)?

public abstract class Enum<E extends Enum<E>> 
extends Object 
implements Comparable<E>, Serializable 

La clase Enum tiene un método estático con esta firma:

T static<T extends Enum<T>> valueOf(Class<T> enumType, String name) 

Pero hay no hay método estático: valueOf(String) definido en la clase Enum ni hacia arriba en la jerarquía en la que Enum pertenece.

La pregunta es ¿de dónde viene valueOf(String)? ¿Es una característica del lenguaje, es decir, una característica incorporada en el compilador?

Respuesta

21

Este método está implícitamente definido por el compilador.

De la documentación:

Tenga en cuenta que para un tipo de enumeración T particular, el método public static T valueOf (String) en esa enumeración declarado implícitamente se pueden utilizar en lugar de este método para asignar a un nombre de la constante enum correspondiente. Todas las constantes de un tipo enum se pueden obtener llamando al método implícito público estático T [] values ​​() de ese tipo.

Desde el Java Language Specification, section 8.9.2:

Además, si E es el nombre de un tipo de enumeración, entonces ese tipo tiene las siguientes implícitamente declaradas métodos estáticos:

/** 
* 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); 
+0

La razón para no incluir este método en el conjunto de métodos de la clase Enum es que no se pudo proporcionar una implementación hasta el momento de compilación cuando se conoce el valor Enum devuelto (que es: un objeto enum del tipo definido por el programador). Aún así, una alternativa sería declararlo realmente como un método abstracto en la clase Enum y dejar que el compilador proporcione una implementación en tiempo de compilación. Por supuesto, esto significa que también podría ser anulado por el usuario, pero el compilador también podría manejar este caso. ¡Parece más natural tener el método en la clase! – Razvan

+2

@Razvan Los métodos estáticos no pueden ser abstractos en Java (o en la mayoría de los otros lenguajes, supongo). – sepp2k

+0

¡No dije resumen estático! – Razvan

0

I creo que debe ser una característica del lenguaje. Por un lado, para crear una enumeración haciendo uno y no necesitar extender Enum:

public enum myEnum { red, blue, green } 

Eso por sí solo, es una característica del lenguaje o de lo contrario tendría que hacer esto:

public class MyEnum extends Enum { ..... } 

segundo , el método, Enum.valueOf(Class<T> enumType, String name), debe ser producido por el compilador cuando usa myEnum.valueOf(String name).

Eso es lo que parece posible dado que la nueva Enum es tanto una característica de idioma como una clase para extender.

Cuestiones relacionadas