2012-08-11 18 views
22

In Java SE 7 (e molto probabilmente nelle versioni precedenti) la classe Enum viene dichiarata in questo modo:Da dove proviene il metodo Enum.valueOf (String)?

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

La classe Enum ha un metodo statico con questa firma:

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

Ma c'è nessun metodo statico: valueOf(String) definito nella classe Enum né superiore nella gerarchia a cui Enum appartiene.

La domanda è da dove viene valueOf(String)? È una funzionalità del linguaggio, ovvero una funzionalità integrata nel compilatore?

risposta

21

Questo metodo è implicitamente definito dal compilatore.

Dalla documentazione:

Si noti che per un particolare tipo enum T, il implicitamente dichiarato metodo statico pubblico T valueOf (String) su quel enum possono essere utilizzati al posto di questo metodo per mappare da un nome a la corrispondente costante enum. Tutte le costanti di un tipo di enum possono essere ottenute chiamando il metodo pubblico implicito T [] values ​​() di quel tipo.

Dal Java Language Specification, section 8.9.2:

Inoltre, se E è il nome di un tipo enum, allora quel tipo ha i seguenti implicitamente dichiarate metodi statici:

/** 
* 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

Il motivo per non includere questo metodo nell'insieme dei metodi della classe Enum è che non è possibile fornire un'implementazione fino al momento della compilazione quando il valore Enum restituito è noto (ovvero: un oggetto enum del tipo definito dal programmatore). Ancora, un'alternativa sarebbe dichiararla effettivamente come un metodo astratto nella classe Enum e lasciare che il compilatore fornisca un'implementazione in fase di compilazione. Ovviamente, questo significa che potrebbe essere sovrascritto dall'utente, ma il compilatore potrebbe gestire anche questo caso. Sembra più naturale avere il metodo in classe! – Razvan

+2

@Razvan I metodi statici non possono essere astratti in Java (o nella maggior parte degli altri linguaggi, suppongo). – sepp2k

+0

Non ho detto astratto statico! – Razvan

0

I penso che debba essere una caratteristica della lingua. Per uno, per creare un enum facendo uno e non ha bisogno di estendere Enum:

public enum myEnum { red, blue, green } 

Che da sola, è una caratteristica del linguaggio, altrimenti si avrebbe bisogno di fare questo:

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

In secondo luogo , il metodo, Enum.valueOf(Class<T> enumType, String name), deve essere prodotto dal compilatore quando si utilizza myEnum.valueOf(String name).

Questo è ciò che sembrerebbe possibile dato che il nuovo Enum è tanto una funzionalità linguistica quanto una classe da estendere.

Problemi correlati