2012-01-05 127 views
1

我來自c#,並發現java的switch語句有點混亂。Java如何開啓枚舉?

你只能打開一個字符,但你可以打開一個枚舉。

這是因爲它在內部切換值?

爲什麼要添加枚舉方法?

+0

「您只能打開一個字符' - 或一個整數?或者一個字符串? – BeRecursive 2012-01-05 17:42:23

+0

咦? C#和Java中的switch語句非常相似 – Matthias 2012-01-05 17:42:32

回答

7

這聽起來像你的問題背後的假設是錯誤的。您可以打開enum值,整數類型(char,int,byte等)或String實例。

在內部,所有開關都編譯爲兩條指令之一,即lookupswitchtableswitch。兩條指令都要求每個案例都標有一個不同的整數。當您使用enum值時,將使用該值的「序數」。當使用String實例時,編譯器插入附加代碼以將每個字符串映射爲唯一值。其他類型直接使用。您可以閱讀關於此的更多信息in another answer.

enum上的方法與任何其他對象上的方法具有相同的用途。你可以使用它們來實現多態行爲,或者作爲簡單的訪問器,或者其他任何東西。

+4

僅在Java 7或更高版本中使用字符串實例! – 2012-01-05 17:42:53

+1

而'enum'值僅在Java 5或更高版本中! – erickson 2012-01-05 18:03:54

+0

好,所以沒有字符串切換,這可能是我所指的(在前7)。 – codecompleting 2012-01-05 21:39:30

1

第二個問題:因爲有時候枚舉需要方法,比如獲取屬性,計算等。枚舉方法非常方便,可以播放一些有趣的遊戲。

即使是tutorial's example也不是過分的設計,使用枚舉屬性和方法取得良好效果。

2

關於「爲什麼要將方法添加到枚舉?」
在c#中,enum是一個帶有一些語法糖的受限整數,在java中,enum是一個實際的類。真的有不同。您可以將方法添加到枚舉中,這與將其添加到任何其他類中的原因相同,以使其可以做到!作爲一個例子,每次你使用開關烤箱時,你都可以在枚舉上完全使用方法而不是開關,並且更加面向對象。如果你需要在同一個枚舉切換在不止一個地方,你可能會使用的方法
而不是做

switch(planet){ 
    case Mars: doWhatMarsDo();break; 
    case Earth: doWhatEarthDo();break; 
} 

的更好,你可以寫

planet.doYourThing();