2013-06-18 27 views
7
public enum Operations { 

    SINGLE, 
    MULTIPLE; 

    private Type operation; 

    public void setOperation(Type operation) { 
     this.operation = operation; 
    } 

    public Type getOperation() { 
     return operation; 
    } 

    public static void main(String[] args) { 
     Operations oper1 = Operations.SINGLE; 
     oper1.setOperation(Type.GET); 

     Operations oper2 = Operations.SINGLE; 
     oper2.setOperation(Type.POST); 
     System.out.println(oper1.getOperation()); 
     System.out.println(oper2.getOperation()); 
    } 
} 

enum Type { 
    POST, 
    GET; 
} 

Trong mã trên, giá trị của các thay đổi hoạt động cho cả Hoạt động. Làm thế nào tôi có thể có hai trường hợp của Operations.SINGLE với loại hoạt động khác nhau?Biến Java enum có tĩnh không?

+1

Câu hỏi của bạn sẽ dễ hiểu hơn nếu bạn cho chúng tôi biết những gì đã được in để xuất bản. (Tôi giả sử nó in 'POST' hai lần?) –

+0

SINGLE tương đương với hoạt động cuối cùng tĩnh công cộng SINGLE = thao tác mới (" SINGLE ", 0) – Blackbelt

Trả lời

12

Có, các trường hợp hoàn toàn là staticfinal. Điều này có nghĩa là mã không chính xác. Hãy tưởng tượng hai chủ đề cả hai gọi SINGLE.setOperation(Type); bạn sẽ không có tự tin vào những gì bạn đang gọi.

Từ Java Language Specification, Section 8.9:

loại Enum (§8.9) phải không được khai báo trừu tượng; làm như vậy sẽ dẫn đến lỗi biên dịch.

Loại enum là hoàn toàn cuối cùng trừ khi nó chứa ít nhất một hằng số enum có nội dung lớp.

Đây là lỗi biên dịch để khai báo rõ ràng loại enum là cuối cùng.

Loại enum lồng nhau hoàn toàn tĩnh. Nó được phép khai báo một cách rõ ràng một kiểu enum lồng nhau là tĩnh.

Và trong phần tiếp theo:

Cơ thể của một kiểu enum có thể chứa hằng enum. Một hằng số enum định nghĩa một thể hiện của kiểu enum.

Vì chỉ có một thể hiện của mỗi hằng số enum, được phép sử dụng toán tử == thay cho hai tham chiếu đối tượng nếu được biết ít nhất một trong số chúng tham chiếu đến hằng số enum .

0

Có, tất cả các phần tử của enumstatic final constant. Tuy nhiên như đã đề cập trong một câu trả lời khác bởi darijan, có một sai lầm hợp lý trong chương trình của bạn.

0

Có một lỗi trong dòng thứ tư của main phương pháp

oper1.setOperation(Type.POST); 

nên

oper2.setOperation(Type.POST); 
+0

đó là lỗi chính tả trong mã – Optional

10

trường Enum là "tĩnh" (tức là hành xử giống như các biến tĩnh), nhưng không phải là immutable.

Tất cả các chủ đề đều thấy cùng một đối tượng được gọi bằng tên enum - chúng giống như những người độc thân, với sự bảo đảm sắt được bảo đảm từ JVM rằng chỉ có một cá thể của một enum. Thay đổi một lĩnh vực enum thay đổi nó cho tất cả mọi người.

Thực hành tốt là làm cho các trường của bạn final trong một môi trường và làm cho chúng trở nên bất biến.

11

Làm cách nào để có hai trường hợp hoạt động.SINGLE với loại hoạt động khác?

Ý tưởng cơ bản đằng sau enum là có một và chỉ một trường hợp của mỗi thành viên. Đây là những gì cho phép bạn so sánh chúng một cách an toàn cho sự bình đẳng, mà không sợ rằng có một SINGLE hoặc MULTIPLE được tạo ở một số nơi khác.

Nếu bạn muốn nhiều phiên bản SINGLE, hãy đặt class, không phải là enum. Thực tế là bạn đã thực hiện enum các điểm gián tiếp có thể thay đổi gián tiếp theo cùng một hướng: sử dụng enum là lựa chọn sai trong trường hợp của bạn.

2

Tôi một năm rưỡi quá muộn. Nhưng tôi thấy câu hỏi không thực sự được trả lời.

Các giải pháp sẽ được sử dụng một lớp thay vì enum, có hai enums như lĩnh vực của nó:

class Operation { 
    Quantity quantity; 
    Type type; 
    Operation(Quantity quantity, Type type) { 
     this.quantity = quantity; 
     this.type = type; 
    } 
} 

Bạn có thể, tất nhiên, sử dụng enum thay vì lớp. Sau đó, bạn sẽ phải liệt kê tất cả kết hợp:

enum Operation { 
    SINGLE_GET(Quantity.SINGLE, Type.GET) 
    SINGLE_POST(Quantity.SINGLE, Type.POST) 
    MULTIPLE_GET(Quantity.MULTIPLE, Type.GET) 
    // ... more options 
    // contents same as in class Operation, constructor private by default 
} 

Cả hai cách trên đều đúng, đôi khi bạn thực sự muốn liệt kê tất cả các kết hợp, hầu hết thời gian, tuy nhiên, bạn nên có lẽ gắn bó với cách tiếp cận class.

Đối với ngắn gọn, tôi không xác định các enums QuantityType, chúng chỉ là các enums đơn giản.

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