Gdzie jest dokumentacja dotycząca metody values ​​() metody Enum?

172

Deklaruję wyliczenie jako:

enum Sex {MALE,FEMALE};

Następnie wykonaj iterację wyliczenia, jak pokazano poniżej:

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

Sprawdziłem interfejs API języka Java, ale nie mogę znaleźć metody values ​​()? Ciekawi mnie, skąd się wzięła ta metoda?

Łącze do API: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html

rai.skumar
źródło

Odpowiedzi:

178

Nie możesz zobaczyć tej metody w javadoc, ponieważ została dodana przez kompilator.

Udokumentowane w trzech miejscach:

Kompilator automatycznie dodaje specjalne metody podczas tworzenia wyliczenia. Na przykład mają metodę wartości statycznych, która zwraca tablicę zawierającą wszystkie wartości wyliczenia w kolejności, w jakiej są zadeklarowane. Ta metoda jest często używana w połączeniu z konstrukcją for-each do iteracji po wartościach typu wyliczeniowego.

  • Enum.valueOfclass
    (specjalna valuesmetoda niejawna jest wymieniona w opisie valueOfmetody)

Wszystkie stałe typu wyliczeniowego można uzyskać, wywołując niejawną publiczną statyczną metodę T [] values ​​() tego typu.

valuesFunkcja po prostu wymienić wszystkie wartości wyliczenia.

Denys Séguret
źródło
6
jakiś konkretny powód? dlaczego nie jest częścią API?
rai.skumar
10
Ponieważ używając tylko standardowego mechanizmu (bez wyliczenia), nie można mieć tej metody statycznej. Specyfikacja javy musiała zostać rozszerzona, aby umożliwić te wyliczenia, dlatego musi zostać dodana przez kompilator.
Denys Séguret
4
Od wersji Java 7 zostało to dodane do javadoc java.lang.Enum, w opisie statycznej metody valueOf.
Catweazle
3
Czy wywołanie „values ​​()” tworzy nową tablicę, czy też używa tej samej tablicy?
programista Androida
3
@androiddeveloper zwraca nową tablicę (w przeciwnym razie możesz zadzierać z wyliczeniem)
Denys Séguret
35

Metoda jest niejawnie zdefiniowana (tj. Generowana przez kompilator).

Z JLS :

Ponadto, jeśli Ejest nazwą enumtypu, to ten typ ma następujące niejawnie zadeklarowane staticmetody:

/**
* 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
źródło
Added by the compileroznacza, że ​​nie ma .java dla tego kodu lub kod jest generowany przez kompilator? Sprawdziłem kod źródłowy OpenJDK Enum i nie mavalues()
Marco Sulla
12

Uruchom to

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

zobaczysz

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

To są wszystkie publiczne metody, które posiada klasa „seks”. Nie ma ich w kodzie źródłowym, dodał javac.exe

Uwagi:

  1. nigdy nie używaj seksu jako nazwy klasy, trudno jest odczytać kod, używamy seksu w Javie

  2. w obliczu łamigłówki Javy, takiej jak ta, zalecam użycie narzędzia do dekompilacji kodu bajtowego (używam wtyczki Eclispe z konspektem kodu bajtowego Andreya Loskutova). To pokaże wszystko, co jest w klasie

Evgeniy Dorofeev
źródło