เอกสารสำหรับค่า () วิธีการของ Enum อยู่ที่ไหน


172

ฉันประกาศ enum เป็น:

enum Sex {MALE,FEMALE};

จากนั้นทำซ้ำ enum ตามที่แสดงด้านล่าง:

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

ฉันตรวจสอบ Java API แต่ไม่สามารถหาค่า () วิธีการ? ฉันอยากรู้ว่าวิธีนี้มาจากไหน?

ลิงก์ API: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html

คำตอบ:


178

คุณไม่เห็นวิธีนี้ใน javadoc เพราะมันถูกเพิ่มโดยคอมไพเลอร์

บันทึกไว้ในสามแห่ง:

คอมไพเลอร์จะเพิ่มวิธีพิเศษบางอย่างโดยอัตโนมัติเมื่อสร้าง Enum ตัวอย่างเช่นพวกเขามีวิธีค่าคงที่ที่ส่งกลับอาร์เรย์ที่มีค่าทั้งหมดของ enum ในลำดับที่พวกเขาจะประกาศ วิธีนี้มักจะใช้ร่วมกับการสร้างสำหรับแต่ละการทำซ้ำมากกว่าค่าของประเภท enum

  • Enum.valueOfชั้นเรียน
    ( valuesวิธีการโดยนัยพิเศษถูกกล่าวถึงในคำอธิบายของvalueOfวิธีการ)

ค่าคงที่ทั้งหมดของชนิด enum สามารถรับได้โดยการเรียกเมธอดค่าคงที่สาธารณะ T [] () ของประเภทนั้น

valuesฟังก์ชั่นเพียงรายการค่าทั้งหมดของการแจงนับ


6
มีเหตุผลเฉพาะสำหรับเรื่องนี้หรือไม่? ทำไมมันไม่ได้เป็นส่วนหนึ่งของ API
rai.skumar

10
เนื่องจากใช้เพียงกลไกมาตรฐาน (ไม่มี enum) คุณจึงไม่มีวิธีแบบคงที่นี้ ข้อกำหนดจาวาจะต้องมีการขยายเพื่อให้ enums เหล่านั้นนั่นคือเหตุผลที่จะต้องเพิ่มโดยคอมไพเลอร์
Denys Séguret

4
ตั้งแต่ Java 7 สิ่งนี้ได้ถูกเพิ่มใน javadoc ของ java.lang.Enum ในคำอธิบายของวิธีการประเมินค่าคงที่
Catweazle

3
การเรียก "values ​​()" สร้างอาร์เรย์ใหม่หรือไม่หรือใช้ซ้ำอีกครั้งหรือไม่
นักพัฒนา android

3
@androiddeveloper มันกลับอาร์เรย์ใหม่ (มิฉะนั้นคุณอาจยุ่งกับ enum) ที่
เด Seguret

35

วิธีการที่ถูกกำหนดโดยนัย (เช่นสร้างโดยคอมไพเลอร์)

จากJLS :

นอกจากนี้หากEเป็นชื่อของenumประเภทดังนั้นประเภทนั้นมีstaticวิธีการประกาศโดยนัยต่อไปนี้:

/**
* 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 compilerหมายความว่าไม่มี. java สำหรับรหัสนี้หรือรหัสถูกสร้างโดยคอมไพเลอร์? ฉันตรวจสอบซอร์สโค้ด OpenJDK ของ Enumและไม่มีvalues()
Marco Sulla

12

เรียกใช้สิ่งนี้

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

แล้วคุณจะได้เห็น

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

นี่เป็นวิธีการสาธารณะทั้งหมดที่มีในชั้นเรียน "เพศ" พวกเขาไม่ได้อยู่ในซอร์สโค้ด javac.exe เพิ่มพวกเขา

หมายเหตุ:

  1. ไม่เคยใช้เซ็กส์เป็นชื่อคลาสมันเป็นการยากที่จะอ่านรหัสของคุณเราใช้ Sex ใน Java

  2. เมื่อเผชิญหน้ากับตัวต่อจาวาเช่นนี้ฉันขอแนะนำให้ใช้เครื่องมือถอดรหัสเสียง bytecode (ฉันใช้ปลั๊กอิน Eclispe ที่เป็นโครงร่าง bytecode ของ Andrey Loskutov) สิ่งนี้จะแสดงสิ่งที่อยู่ภายในชั้นเรียน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.