2013-06-18 136 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; 
} 

在上面的代碼中,兩個操作的操作值都會更改。我如何擁有兩種不同操作類型的Operations.SINGLE實例?Java枚舉變量是靜態的嗎?

+1

如果您告訴我們打印到標準輸出的內容,您的問題會更容易理解。 (我假設它打印兩次「POST」?) –

+0

SINGLE相當於public static final操作SINGLE = new操作(「SINGLE」,0) – Blackbelt

回答

12

是的,實例隱含地爲staticfinal。這意味着代碼是不明智的。設想兩條線索都叫SINGLE.setOperation(Type);你會對你打來的電話沒有信心。

Java Language Specification, Section 8.9

枚舉類型(§8.9)不能聲明抽象;這樣做會導致編譯時錯誤。

枚舉類型是隱式最終的,除非它至少包含一個具有類體的枚舉常量。

顯式聲明枚舉類型爲final是編譯時錯誤。

嵌套枚舉類型是隱式靜態的。允許顯式聲明一個嵌套的枚舉類型爲靜態的。

而且在下一節:

枚舉類型可含有枚舉常數的機構。一個枚舉常量定義了枚舉類型的一個實例。

因爲每個枚舉常量只有一個實例,所以在比較兩個對象引用時,如果知道至少有一個引用了枚舉常量,則允許使用==運算符代替equals方法。

0

是的,enum所有元素都是static final constant。 但正如darijan的另一個回答中所提到的,程序中存在邏輯錯誤。

0

有一個在main方法的第四行的誤差

oper1.setOperation(Type.POST); 

應該是

oper2.setOperation(Type.POST); 
+0

這是代碼中的錯字 – Optional

10

枚舉實例是 「靜態」(即表現得像靜態變量),但並不immutable

所有線程都看到枚舉名稱引用同一個對象 - 他們喜歡單身,從JVM鐵一般的保證,只有過一個枚舉的實例。更改枚舉的字段會改變每個人的字段。

這是很好的做法,讓您的字段枚舉final,並讓他們一成不變的。

11

怎樣纔可以有不同的操作類型Operations.SINGLE的兩個實例?

enum背後的基本思想是每個成員都有一個且只有一個實例。這可以讓你安全地比較它們的平等性,而不用擔心在其他地方創建了另一個SINGLEMULTIPLE

如果您想要SINGLE的多個實例,請將其設置爲class而不是enum。事實上,你讓你的enum可變的間接點在相同的方向:使用enum是一個錯誤的選擇在你的情況。

2

我已經一年半了。但我看到這個問題沒有真正回答。

解決辦法是使用類而不是枚舉,有這兩個枚舉作爲其字段:

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

你可以,當然,用枚舉代替類。然後,你必須枚舉所有組合:

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 
} 

這兩種方法都是有效的,有時候你真的要列舉所有的組合,大部分的時間,但是,你應該與class辦法堅持下去。

爲簡潔起見,我沒有定義枚舉QuantityType,它們只是簡單的枚舉。