2012-12-01 13 views
139

Oświadczam enum jako:Gdzie jest dokumentacja dla metody values ​​() Enum?

enum Sex {MALE,FEMALE}; 

a następnie iterate enum, jak pokazano poniżej:

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

Sprawdziłem Java API, ale nie może znaleźć wartości() metoda? Ciekawi mnie, skąd pochodzi ta metoda?

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

+0

napisał artykuł na ten temat: [Gdzie javadoc dla wartości i metody valueOf na teksty stałe ?!] (http://programming.guide/java/javadoc-for-enum -values.html) – aioobe

Odpowiedz

148

nie można zobaczyć tej metody w javadoc bo to dodane przez kompilator.

Udokumentowane w trzech miejscach:

Kompilator automatycznie dodaje jakieś specjalne metody, gdy tworzy wyliczenia. Na przykład mają metodę wartości statycznych, która zwraca tablicę zawierającą wszystkie wartości wyliczenia w zadeklarowanej kolejności. Ta metoda jest powszechnie stosowana w połączeniu z każdym konstruktem do iteracji wartościami typu wyliczeniowego.

  • Enum.valueOf klasa
    (Specjalny niejawna values metoda jest mowa w opisie valueOf metody)

Wszystkie stałe typu enum można uzyskać dzwoniąc na niejawny public static T [] wartości() metoda tego typu.

Funkcja values po prostu wymienić wszystkie wartości wyliczenia.

+6

konkretny powód tego? dlaczego nie jest częścią API? –

+7

Ponieważ używanie tylko standardowego mechanizmu (bez wyliczania), nie można mieć tej statycznej metody. Specyfikacja java musiała zostać rozszerzona, aby umożliwić te wyliczenia, dlatego musi zostać dodana przez kompilator. –

+0

great.thanks lot –

27

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

Z JLS:

Ponadto, jeśli E to nazwa typu enum, to typ ma następujące niejawnie zadeklarowanej static metody:

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

Uruchom ten

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

widać

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

Są to wszystkie metody publiczne, że klasa „sex” ma. Oni nie są w kodzie źródłowym, javac.exe dodaje im

Uwagi:

  1. nigdy nie używać seksu jako nazwa klasy, jest to trudne do odczytania kodu używamy Sex w Javie

  2. w obliczu takiej układanki Java, jak ta, zalecam użycie narzędzia dekompilacji kodu bajtowego (używam konspektu bajtów Eclispe Andyja Loskutova). To pokaże wszystko, co znajduje się wewnątrz klasy

+0

Czy próbowałeś 'JD-GUI'? http://java.decompiler.free.fr/?q=jdgui – dantuch

+0

jeszcze nie, ale zrobię to, dzięki –

+0

dzięki za korektę ... poprawiono literówkę w nazwie enum :) –

Powiązane problemy