¿Dónde está la documentación para el método de valores () de Enum?

172

Declaro una enumeración como:

enum Sex {MALE,FEMALE};

Y luego, itere enum como se muestra a continuación:

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

¿Comprobé la API de Java pero no puedo encontrar el método de valores ()? Tengo curiosidad por saber de dónde viene este método.

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

rai.skumar
fuente

Respuestas:

178

No puede ver este método en javadoc porque lo ha agregado el compilador.

Documentado en tres lugares:

El compilador agrega automáticamente algunos métodos especiales cuando crea una enumeración. Por ejemplo, tienen un método de valores estáticos que devuelve una matriz que contiene todos los valores de la enumeración en el orden en que se declaran. Este método se usa comúnmente en combinación con la construcción for-each para iterar sobre los valores de un tipo de enumeración.

  • Enum.valueOfclase
    (El valuesmétodo implícito especial se menciona en la descripción del valueOfmétodo)

Todas las constantes de un tipo enum se pueden obtener llamando al método público implícito estático T [] values ​​() de ese tipo.

La valuesfunción simplemente enumera todos los valores de la enumeración.

Denys Séguret
fuente
66
alguna razón específica para esto? ¿Por qué no es parte de API?
rai.skumar
10
Porque usando solo el mecanismo estándar (sin enumeración), no podría tener este método estático. La especificación de Java tuvo que extenderse para permitir esas enumeraciones, por eso debe ser agregada por el compilador.
Denys Séguret
44
Desde Java 7, esto se ha agregado al javadoc de java.lang.Enum, en la descripción del método static valuOf.
Catweazle
3
¿Llamar a "values ​​()" crea una nueva matriz o reutiliza la misma?
Desarrollador de Android
3
@androiddeveloper devuelve una nueva matriz (de lo contrario, podría meterse con la enumeración)
Denys Séguret
35

El método está implícitamente definido (es decir, generado por el compilador).

De la JLS :

Además, si Ees el nombre de un enumtipo, ese tipo tiene los siguientes staticmétodos declarados implícitamente :

/**
* 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);
NPE
fuente
Added by the compilersignifica que no hay .java para este código o que el compilador genera el código? Verifiqué el código fuente de OpenJDK de Enum y no hay ningunovalues()
Marco Sulla
12

Ejecuta esto

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

ya verás

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

Todos estos son métodos públicos que tiene la clase de "sexo". No están en el código fuente, javac.exe los agregó

Notas:

  1. nunca use sexo como nombre de clase, es difícil leer su código, usamos Sex in Java

  2. cuando me enfrento a un rompecabezas de Java como este, recomiendo usar una herramienta de descompilación de bytecode (uso el complemento Eclispe del esquema de bytecode de Andrey Loskutov). Esto mostrará todo lo que hay dentro de una clase.

Evgeniy Dorofeev
fuente