2012-08-04 22 views
19

Nếu bạn có một enum nhưEnum như biến dụ

enum Coffee { 
    BIG, 
    SMALL 
} 

và một lớp học có một biến Ví dụ như thế này của enum:

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

Tại sao là nó có thể trong constructor để nói ví dụ coffee.BIG? Tôi không hiểu rằng bạn có thể sử dụng tham chiếu? Có phải enum là các biến mẫu được khởi tạo cho một cái gì đó khác ngoài null không? Đây là câu hỏi tự kiểm tra số 4 trong cuốn sách SCJP trong chương đầu tiên. Tôi đã cố gắng rút ngắn mã và câu hỏi.

Trả lời

18

Trong

enum Coffee { 
    BIG, 
    SMALL 
} 

lớn hay nhỏ là public static final lĩnh vực lớp cà phê, và giống như tất cả các lĩnh vực tĩnh họ có thể được truy cập bằng tên lớp như

Coffee b1 = Coffee.BIG; 

hoặc bằng cách tham chiếu của cùng loại như lớp , như

Coffee s2 = b1.SMALL; 
Coffee s3 = Coffee.BIG.SMALL; //BIG is reference of type Coffee so it is OK (but looks strange) 

Nhưng hãy nhớ rằng chúng ta nên tránh truy cập các thành viên tĩnh thông qua tài liệu tham khảo. Điều này tạo ra sự nhầm lẫn vì chúng tôi không thực sự truy cập các thành viên của dụ nhưng các thành viên của lớp (ví dụ như không có hành vi đa hình).

5

Trước Java 5 cách để thực hiện enums là tạo một lớp với hàm tạo riêng và trường cuối cùng công khai của cùng một lớp được khởi tạo với giá trị cụ thể.

Kể từ Java 5, enum xây dựng là một cách hiệu quả một đường mà không giống nhau, và sẽ chăm sóc của những thứ như các giá trị null không được phép, các giá trị enum trở thành lĩnh vực public static, vv

12

Đây là những gì xảy ra đằng sau những cảnh:

E:\workspace>type Coffee.java 
public enum Coffee { 
    BIG, 
    SMALL 
} 

E:\workspace>javap Coffee 
Compiled from "Coffee.java" 
public final class Coffee extends java.lang.Enum<Coffee> { 
    public static final Coffee BIG; 
    public static final Coffee SMALL; 
    public static Coffee[] values(); 
    public static Coffee valueOf(java.lang.String); 
    static {}; 
} 

Như bạn thấy BIGSMALL cơ bản là lĩnh vực tĩnh trong enum của bạn.

Các JLS cũng làm cho phần này rõ ràng:

Ngoài các thành viên rằng một kiểu enum E thừa hưởng từ Enum, cho từng tuyên bố enum liên tục với tên n, kiểu enum có ngầm trường cuối cùng tĩnh công khai có tên n của loại E. Các trường này được coi là được khai báo theo thứ tự như hằng số enum tương ứng, trước khi bất kỳ trường tĩnh rõ ràng được khai báo trong loại enum. Mỗi trường như vậy được khởi tạo vào hằng số enum tương ứng với nó.

Hy vọng điều này sẽ làm rõ câu hỏi của bạn.