Enum'un değerleri () yöntemi için belgeler nerede?


172

Bir numaralandırma şöyle beyan ederim:

enum Sex {MALE,FEMALE};

Ve sonra, aşağıda gösterildiği gibi enum tekrarlayın:

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

Java API'sini kontrol ettim ancak değerleri () yöntemini bulamıyorum? Bu yöntemin nereden geldiğini merak ediyorum?

API bağlantısı: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html

Yanıtlar:


178

Bu yöntemi javadoc'ta göremezsiniz çünkü derleyici tarafından eklenir.

Üç yerde belgelenmiştir:

Derleyici, bir enum oluşturduğunda otomatik olarak bazı özel yöntemler ekler. Örneğin, sıralamanın tüm değerlerini bildirildikleri sırayla içeren bir dizi döndüren statik değerler yöntemi vardır. Bu yöntem, enum tipinin değerleri üzerinde yineleme yapmak için for-each yapısı ile birlikte yaygın olarak kullanılır.

  • Enum.valueOfclass
    (Özel örtük valuesyöntem, yöntemin açıklamasında belirtilmiştir valueOf)

Bir enum türünün tüm sabitleri, o türün örtülü genel statik T [] değerleri () yöntemi çağrılarak elde edilebilir.

valuesFonksiyon sadece numaralandırma tüm değerlerini listeler.


6
bunun özel bir nedeni var mı? neden API'nin bir parçası değil?
rai.skumar

10
Çünkü sadece standart mekanizmayı (numaralandırma olmadan) kullanarak bu statik yönteme sahip olamazsınız. Java belirtimi bu numaralara izin vermek için genişletilmesi gerekiyordu, bu yüzden derleyici tarafından eklenmelidir.
Denys Séguret

4
Java 7'den beri bu, statik valuOf yönteminin açıklamasında java.lang.Enum javadocuna eklenmiştir.
Catweazle

3
"Değerleri ()" çağırmak yeni bir dizi oluşturur mu yoksa aynı diziyi yeniden mi kullanır?
android geliştirici

3
@androiddeveloper yeni bir dizi döndürür (aksi takdirde numaralandırma ile uğraşabilirsiniz)
Denys Séguret

35

Yöntem dolaylı olarak tanımlanır (yani derleyici tarafından oluşturulur).

Gönderen JLS :

Ayrıca E, bir enumtürün adı da varsa , o tür aşağıdaki örtülü olarak bildirilen staticyöntemlere sahiptir:

/**
* 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 compilerBu kod için .java yok veya kod derleyici tarafından üretilen anlamına gelir? Enum'un OpenJDK kaynak kodunu kontrol ettim ve hayırvalues()
Marco Sulla

12

Bunu çalıştır

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

göreceksin

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

Bunların hepsi "seks" sınıfının sahip olduğu genel yöntemlerdir. Kaynak kodunda değiller, javac.exe bunları ekledi

Notlar:

  1. Sınıfı asla seks olarak kullanmayın, kodunuzu okumak zor, Java'da Sex kullanıyoruz

  2. Bunun gibi bir Java bulmacasına bakarken, bir baytkod dekompler aracı kullanmanızı tavsiye ederim (Andrey Loskutov'un bayt anahattı Eclispe eklentisini kullanıyorum). Bu bir sınıfın içinde ne olduğunu gösterir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.