2013-05-23 43 views
9

Tôi đang đọc Java hiệu quả được viết bởi Joshua Bloch xuất bản năm 2008, và một mẹo là thay thế các cấu trúc enum bằng các lớp. Đây là ví dụ được hiển thị từ cuốn sách.Việc thay thế các cấu trúc enum với các lớp trong Java vẫn có liên quan?

public class Suit { 
    private final String name; 
    public Suit(String name) { this.name = name; } 
    public String toString() { return name; } 
    public static final Suit CLUBS = new Suit("clubs"); 
    public static final Suit DIAMONDS = new Suit("diamonds"); 
    public static final Suit HEARTS = new Suit("hearts"); 
    public static final Suit SPADES = new Suit("spades"); 
} 

Câu hỏi của tôi là vì Java hiện hỗ trợ loại enum, bạn vẫn nên sử dụng phương pháp trên? Dưới đây là ví dụ về loại enum Java.

public enum Day { 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
} 
+0

enums trong Java là các lớp. – FDinoff

+0

Đối với chức năng cơ bản giống như enum không có lý do gì để không sử dụng 'enum' đơn giản. Có một vài cải tiến nhỏ mà bạn không thể làm với enums, nơi mà kiểu enum kiểu an toàn vẫn có thể được áp dụng. –

+0

Đọc ấn bản thứ hai của cuốn sách, nó thực sự đáng giá, vì nó bao gồm các tính năng Java mới. –

Trả lời

10

Các "hiệu quả Java" Cuốn sách đã được viết trước khi sự ra đời của enum s sang ngôn ngữ, vì vậy tôi sẽ khuyên bạn sử dụng tính năng enum để thay thế. May mắn thay, Java enum s là rất linh hoạt, vì vậy bạn có thể làm theo lời khuyên của Joshua khá chặt chẽ sử dụng các tính năng enum:

public enum Day { 
    SUNDAY("Sunday", 0) 
, MONDAY("Monday", 1) 
, TUESDAY("Tuesday", 2) 
, WEDNESDAY("Wednesday", 3) 
, THURSDAY("Thursday", 4) 
, FRIDAY("Friday", 5) 
, SATURDAY("Saturday", 6); 

    private String name; 
    private int ordinal; 
    public String getName() { return name; } 
    public int getOrdinal() { return ordinal; } 
    public Day(String name, int ordinal) { 
     this.name = name; 
     this.ordinal = ordinal; 
    } 
} 
+0

EnumSets là một cấu trúc khá hữu ích. – wmorrison365

+6

Cần lưu ý rằng ấn bản thứ 2 không bao gồm việc sử dụng các enums. – Jonathan

+0

Cảm ơn dasblinkenlight, ví dụ của bạn rất hữu ích. – beyonddc

2

Tôi nghĩ rằng ý tưởng này là hoàn toàn ngược lại. Nếu bạn có cấu trúc giống như enum - hãy sử dụng enum.

Ví dụ về lớp học của bạn không hoàn toàn phù hợp với enum bạn đã viết. Đầu tiên, nó không thể được biên dịch bởi vì nó chứa một số trường có tên là CLUBS. Thứ hai, enum chứa các ngày không được đề cập trong lớp của bạn.

+0

oops! Bạn bắt gặp lỗi đánh máy của tôi. – beyonddc

0

Theo như tôi biết, java biên soạn enum-s thành public static final đối tượng. Bạn có thể kiểm tra điều này bằng cách xem các tập tin enum .class với javap (http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javap.html).

+0

Đó là chính xác, nhưng điều đó không thực sự trả lời câu hỏi. –

+0

Nó cho thấy rằng cả hai cách tiếp cận là tương đương. – mrak

+0

chỉ khi mã nguồn không quan trọng, và tôi muốn nói nguồn là rất quan trọng. –

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