Dov'è la documentazione per il metodo value () di Enum?


172

Dichiaro un enum come:

enum Sex {MALE,FEMALE};

E poi, iterare enum come mostrato di seguito:

for(Sex v : Sex.values()){
    System.out.println(" values :"+ v);
}

Ho controllato l'API Java ma non riesco a trovare il metodo valori ()? Sono curioso di sapere da dove viene questo metodo?

Link API: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html

Risposte:


178

Non puoi vedere questo metodo in javadoc perché è stato aggiunto dal compilatore.

Documentato in tre luoghi:

Il compilatore aggiunge automaticamente alcuni metodi speciali quando crea un enum. Ad esempio, hanno un metodo con valori statici che restituisce un array contenente tutti i valori dell'enum nell'ordine in cui sono dichiarati. Questo metodo è comunemente usato in combinazione con il costrutto for-each per scorrere i valori di un tipo enum.

  • Enum.valueOfclass
    (lo speciale valuesmetodo implicito è menzionato nella descrizione del valueOfmetodo)

Tutte le costanti di un tipo enum possono essere ottenute chiamando il metodo dei valori T [] statici pubblici impliciti di quel tipo.

La valuesfunzione elenca semplicemente tutti i valori dell'enumerazione.


6
qualche motivo specifico per questo? perché non fa parte dell'API?
rai.skumar,

10
Perché usando solo il meccanismo standard (senza enum), non puoi avere questo metodo statico. La specifica java ha dovuto essere estesa per consentire quegli enum, ecco perché deve essere aggiunta dal compilatore.
Denys Séguret,

4
Da Java 7 questo è stato aggiunto al javadoc di java.lang.Enum, nella descrizione del metodo valuOf statico.
Catweazle,

3
La chiamata di "valori ()" crea un nuovo array o riutilizza lo stesso?
sviluppatore Android

3
@androiddeveloper restituisce un nuovo array (altrimenti potresti incasinare l'enum)
Denys Séguret,

35

Il metodo è implicitamente definito (cioè generato dal compilatore).

Dal JLS :

Inoltre, se Eè il nome di un enumtipo, quel tipo ha i seguenti staticmetodi dichiarati implicitamente :

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

Added by the compilersignifica che non c'è .java per questo codice o che il codice è generato dal compilatore? Ho controllato il codice sorgente OpenJDK di Enum e non c'èvalues()
Marco Sulla

12

Esegui questo

    for (Method m : sex.class.getDeclaredMethods()) {
        System.out.println(m);
    }

vedrai

public static test.Sex test.Sex.valueOf(java.lang.String)
public static test.Sex[] test.Sex.values()

Questi sono tutti metodi pubblici della classe "sesso". Non sono nel codice sorgente, javac.exe li ha aggiunti

Appunti:

  1. non usare mai sesso come nome di classe, è difficile leggere il tuo codice, usiamo Sesso in Java

  2. di fronte a un puzzle Java come questo, consiglio di utilizzare uno strumento di decompilatore bytecode (utilizzo il plug-in Eclispe del profilo bytecode di Andrey Loskutov). Questo mostrerà tutto ciò che è all'interno di una classe

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.