2011-03-02 48 views
6

Tôi muốn có thể xác định một lớp Enum có thể bao gồm một Enum khác cũng như các giá trị riêng của nó. Ví dụ,:Java Enum tham chiếu một enum khác

public enum A { 
    A1, A2, A3; 
} 

public enum B{ 
    B1, B2, ...(somehow define references to all values in enum A) 
} 

như vậy mà bất kỳ giá trị chứa trong enum B phải được một trong hai định nghĩa initself (như B1, B2) hoặc bất kỳ giá trị của enum A.

Cảm ơn,

+1

tại sao bạn cần mở rộng enum? – Woot4Moo

Trả lời

5

như vậy mà B là công đoàn của AB? Điều đó là không thể nếu không có B mở rộng A, là not supported bằng java. Cách để tiến hành là để tạo ra một enum chứa các giá trị kết hợp của AB, ví dụ,

enum C { 
    A1, A2, A3, B1, B2; 
} 
+0

(Đó sẽ là 'A' mở rộng' B'.) –

1

Something như thế này?

enum A { 
    A1, A2; 
} 

enum B { 
    B1(null), 
    B2(null), 
    A1(A.A1), 
    A2(A.A2); 

    private final A aRef; 
    private final B(A aRef) { 
     this.aRef = aRef; 
    } 
} 
+0

Cảm ơn tất cả các câu trả lời của bạn. Có vẻ như không có cách nào dễ dàng để làm những gì tôi nghĩ. Thay vào đó, tôi đã chọn sử dụng một lớp java kế hoạch để mô phỏng tính năng như vậy. – MikeMY

1

Gần nhất bạn có thể nhận là có A và B triển khai một số giao diện được chia sẻ.

enum A implements MyEnum{A1,A2} 
enum B implements MyEnum{B1,B2} 

MyEnum e = B.B1; 

Giải pháp này sẽ không hoạt động với tuyên bố chuyển đổi cũng như với bộ sưu tập enum tối ưu.

Trường hợp sử dụng của bạn không được hỗ trợ bởi thực thi enum java, hoặc phức tạp để thực hiện (so với tính hữu dụng của nó) hoặc nó không xuất hiện (không có ngôn ngữ nào mà tôi biết hỗ trợ trực tiếp) .

2

Thông thường, vì chúng tôi đang làm việc trong java và thường đăng ký thiết kế OO, bạn có thể nhận được chức năng này thông qua tiện ích mở rộng. Tuy nhiên, enums mở rộng java.lang.Enum ngầm và do đó không thể mở rộng lớp khác.

Điều này có nghĩa là khả năng mở rộng cho enums được bắt nguồn từ một nguồn khác.

Joshua Bloch bổ sung điều này trong Java hiệu quả: Ấn bản thứ hai trong mục 34, khi anh trình bày mẫu giao diện dùng chung cho enums. Dưới đây là ví dụ của anh về mẫu:

public interface Operation { 
     double apply(double x, double y); 
    } 

    public enum BasicOperation implements Operation { 
     PLUS("+") { 
      public double apply(double x, double y) { return x + y; } 
     }, 
     MINUS("-") { 
      public double apply(double x, double y) { return x - y; } 
     }, 
     TIMES("*") { 
      public double apply(double x, double y) { return x * y; } 
     }, 
     DIVIDE("/") { 
      public double apply(double x, double y) { return x/y; } 
    } 

Đây là khoảng gần bạn có thể chia sẻ trạng thái khi nói đến enums. Như Johan Sjöberg đã nói ở trên, có lẽ chỉ đơn giản là dễ dàng kết hợp các enums vào một enum khác.

Chúc bạn may mắn!