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

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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.