Di mana dokumentasi untuk metode nilai () dari Enum?

172

Saya menyatakan enum sebagai:

enum Sex {MALE,FEMALE};

Dan kemudian, ulangi enum seperti yang ditunjukkan di bawah ini:

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

Saya memeriksa Java API tetapi tidak dapat menemukan metode values ​​()? Saya ingin tahu dari mana metode ini berasal?

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

rai.skumar
sumber

Jawaban:

178

Anda tidak dapat melihat metode ini di javadoc karena ditambahkan oleh kompiler.

Didokumentasikan di tiga tempat:

Kompiler secara otomatis menambahkan beberapa metode khusus ketika membuat enum. Misalnya, mereka memiliki metode nilai statis yang mengembalikan array yang berisi semua nilai enum dalam urutan yang dideklarasikan. Metode ini umumnya digunakan dalam kombinasi dengan masing-masing konstruk untuk beralih pada nilai-nilai tipe enum.

  • Enum.valueOfclass
    ( valuesMetode implisit khusus disebutkan dalam deskripsi valueOfmetode)

Semua konstanta dari tipe enum dapat diperoleh dengan memanggil metode T [] nilai statis publik () jenis tersebut.

The valuesFungsi hanya daftar semua nilai pencacahan.

Denys Séguret
sumber
6
ada alasan khusus untuk ini? mengapa itu bukan bagian dari API?
rai.skumar
10
Karena hanya menggunakan mekanisme standar (tanpa enum), Anda tidak dapat memiliki metode statis ini. Spesifikasi java harus diperluas untuk memungkinkan enum tersebut, itu sebabnya harus ditambahkan oleh kompiler.
Denys Séguret
4
Sejak Java 7 ini telah ditambahkan ke javadoc dari java.lang.Enum, dalam deskripsi metode valuOf statis.
Catweazle
3
Apakah memanggil "nilai ()" membuat array baru, atau apakah menggunakan kembali yang sama?
pengembang android
3
@androiddeveloper mengembalikan array baru (jika tidak, Anda mungkin mengacaukan enum)
Denys Séguret
35

Metode ini didefinisikan secara implisit (yaitu dihasilkan oleh kompiler).

Dari JLS :

Selain itu, jika Eadalah nama suatu enumtipe, maka tipe tersebut memiliki staticmetode yang dinyatakan secara implisit berikut ini :

/**
* 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
sumber
Added by the compilerberarti tidak ada. java untuk kode ini atau kode ini dihasilkan oleh kompiler? Saya memeriksa kode sumber OpenJDK dari Enum dan tidak adavalues()
Marco Sulla
12

Jalankan ini

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

kamu akan lihat

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

Ini semua adalah metode umum yang dimiliki kelas "jenis kelamin". Mereka tidak ada dalam kode sumber, javac.exe menambahkannya

Catatan:

  1. jangan pernah menggunakan seks sebagai nama kelas, sulit untuk membaca kode Anda, kami menggunakan Seks di Jawa

  2. ketika menghadapi teka-teki Java seperti ini, saya sarankan untuk menggunakan alat dekompiler bytecode (saya menggunakan bytecode garis besar plugin Andrey Loskutov's Eclispe plugin). Ini akan menunjukkan semua yang ada di dalam kelas

Evgeniy Dorofeev
sumber