2012-12-01 30 views
139

Tôi tuyên bố một enum như:Tài liệu cho phương thức values ​​() của Enum ở đâu?

enum Sex {MALE,FEMALE}; 

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

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

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

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

+0

Đã viết một bài viết về điều này: [javadoc cho giá trị và phương pháp valueOf trên enums ?!] (http://programming.guide/java/javadoc-for-enum -values.html) – aioobe

Trả lời

148

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

dự liệu ở ba nơi:

Trình biên dịch sẽ tự động thêm một số phương pháp đặ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 là . Phương pháp này thường được sử dụng kết hợp với cấu trúc cho mỗi cấu trúc để lặp qua các giá trị của loại enum.

  • Enum.valueOf lớp
    (The đặc biệt tiềm ẩn phương pháp values được đề cập trong mô tả của valueOf phương pháp)

Tất cả các hằng số của một kiểu enum có thể thu được bằng cách gọi ngầm public static T Phương thức [] values ​​() của kiểu đó.

Chức năng values chỉ cần 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ể nào cho điều này? tại sao nó không phải là một phần của API? –

+7

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 những enums đó, đó là lý do tại sao nó phải được trình biên dịch thêm vào. –

+0

great.thanks rất nhiều –

27

Phương pháp này được xác định ngầm định (tức là do trình biên dịch tạo ra).

Từ JLS:

Bên cạnh đó, nếu E là tên của một loại enum, sau đó kiểu đó có ngầm tuyên bố static phương pháp 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); 
9

Run

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 pháp công khai mà lớp "sex" có. Họ đang không có trong mã nguồn, javac.exe thêm chúng

Ghi chú:

  1. bao giờ sử dụng tình dục như một 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ư thế này, tôi khuyên bạn nên sử dụng một công cụ giải mã bytecode bytecode (tôi sử dụng plugin phác thảo bytecode bytecode 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

+0

bạn đã thử 'JD-GUI' chưa? http://java.decompiler.free.fr/?q=jdgui – dantuch

+0

chưa, nhưng tôi sẽ, cảm ơn –

+0

nhờ chỉnh sửa ... đã sửa lỗi đánh máy trong tên enum :) –

Các vấn đề liên quan