Tài liệu cho phương thức value () của Enum ở đâu?


172

Tôi tuyên bố một enum là:

enum Sex {MALE,FEMALE};

Và sau đó, lặp lại enum như hình dưới đây:

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

Tôi đã kiểm tra API Java nhưng không thể tìm thấy phương thức value ()? Tôi tò mò không biết phương pháp này đến từ đâu?

Liên kết API: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html

Câu trả lời:


178

Bạn không thể thấy phương thức này trong javadoc vì nó được thêm bởi trình biên dịch.

Tài liệu ở ba nơi:

Trình biên dịch tự động thêm một số phương thức đặc biệt khi nó tạo ra một enum. Ví dụ, chúng có một phương thức giá trị tĩnh trả về một mảng chứa tất cả các giá trị của enum theo thứ tự chúng được khai báo. Phương pháp này thường được sử dụng kết hợp với cấu trúc for-Each để lặp lại các giá trị của loại enum.

  • Enum.valueOfclass
    ( valuesPhương thức ngầm đặc biệt được đề cập trong phần mô tả valueOfphương thức)

Tất cả các hằng số của một loại enum có thể thu được bằng cách gọi phương thức T [] tĩnh () giá trị tĩnh của loại đó.

Các valueschức năng đơn giản là liệt kê tất cả các giá trị thuộc kiểu liệt kê.


6
bất kỳ lý do cụ thể cho việc này? Tại sao nó không phải là một phần của API?
rai.skumar

10
Bởi vì chỉ sử dụng cơ chế tiêu chuẩn (không có enum), bạn không thể có phương thức tĩnh này. Đặc tả java phải được mở rộng để cho phép các enum đó, đó là lý do tại sao nó phải được thêm vào bởi trình biên dịch.
Denys Séguret

4
Kể từ Java 7, điều này đã được thêm vào javadoc của java.lang.Enum, trong phần mô tả phương thức valuOf tĩnh.
Catweazle

3
Việc gọi "value ()" có tạo ra một mảng mới hay nó sử dụng lại cùng một mảng?
nhà phát triển Android

3
@androiddeveloper nó trả về một mảng mới (nếu không bạn có thể gây rối với enum)
Denys Séguret

35

Phương thức này được định nghĩa ngầm định (tức là được tạo bởi trình biên dịch).

Từ JLS :

Ngoài ra, nếu Elà tên của một enumloại, thì loại đó có các staticphương thức được khai báo ngầm sau đây :

/**
* 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 compilercó nghĩa là không có .java cho mã này hoặc mã được tạo bởi trình biên dịch? Tôi đã kiểm tra mã nguồn OpenJDK của Enum và không cóvalues()
Marco Sulla

12

Chạy cái này

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

Bạn sẽ thấy

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

Đây là tất cả các phương thức công khai mà lớp "sex" có. Chúng không có trong mã nguồn, javac.exe đã thêm chúng vào

Ghi chú:

  1. không bao giờ sử dụng tình dục làm tên lớp, thật khó để đọc mã của bạn, chúng tôi sử dụng Sex trong Java

  2. khi đối mặt với một câu đố Java như câu đố này, tôi khuyên bạn nên sử dụng một công cụ dịch ngược mã byte (tôi sử dụng plugin Eclispe phác thảo mã byte của Andrey Loskutov). Điều này sẽ hiển thị tất cả những gì bên trong một lớp học

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.