Onde está a documentação para o método values ​​() do Enum?

172

Declaro uma enum como:

enum Sex {MALE,FEMALE};

E, em seguida, itere o enum, como mostrado abaixo:

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

Eu verifiquei a API Java, mas não consigo encontrar o método values ​​()? Estou curioso para saber de onde esse método vem?

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

rai.skumar
fonte

Respostas:

178

Você não pode ver esse método no javadoc porque ele foi adicionado pelo compilador.

Documentado em três locais:

O compilador adiciona automaticamente alguns métodos especiais ao criar uma enumeração. Por exemplo, eles têm um método de valores estáticos que retorna uma matriz que contém todos os valores da enumeração na ordem em que são declarados. Esse método é comumente usado em combinação com a construção for-each para iterar sobre os valores de um tipo de enumeração.

  • Enum.valueOfclasse
    (O valuesmétodo implícito especial é mencionado na descrição do valueOfmétodo)

Todas as constantes de um tipo enum podem ser obtidas chamando o método estático público implícito T [] values ​​() desse tipo.

A valuesfunção simplesmente lista todos os valores da enumeração.

Denys Séguret
fonte
6
alguma razão específica para isso? por que não faz parte da API?
Rai.skumar
10
Porque usando apenas o mecanismo padrão (sem enum), você não poderia ter esse método estático. A especificação java teve que ser estendida para permitir essas enumerações, é por isso que deve ser adicionada pelo compilador.
Denys Séguret 01/12/12
4
Desde o Java 7, isso foi adicionado ao javadoc de java.lang.Enum, na descrição do método valuOf estático.
Novidade
3
Chamar "values ​​()" cria uma nova matriz ou reutiliza a mesma?
desenvolvedor android
3
@androiddeveloper ele retorna uma nova matriz (caso contrário você pode mexer com o enum)
Denys Séguret
35

O método é definido implicitamente (isto é, gerado pelo compilador).

Do JLS :

Além disso, se Eé o nome de um enumtipo, esse tipo tem os seguintes staticmétodos declarados 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);
NPE
fonte
Added by the compilersignifica que não há .java para esse código ou o código é gerado pelo compilador? Eu verifiquei o código fonte OpenJDK de Enum e não há évalues()
Marco Sulla
12

Rode isto

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

você verá

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

Todos esses são métodos públicos que a classe "sexo" possui. Eles não estão no código fonte, o javac.exe os adicionou

Notas:

  1. nunca use sexo como nome de classe, é difícil ler seu código, usamos Sex in Java

  2. ao enfrentar um quebra-cabeça Java como este, recomendo usar uma ferramenta de decompilador de bytecode (eu uso o plug-in Eclispe de contorno de bytecode de Andrey Loskutov). Isso mostrará tudo o que há dentro de uma classe

Evgeniy Dorofeev
fonte