2008-11-21 106 views
9

是否有人知道爲什麼Java不允許您打開大於整數的數字?這背後有什麼技術原因嗎?Java和開關盒

回答

-7

也許是因爲它是一個很糟糕的編程在交換機中具有超過整數最大情況?

如果你想切換長變量,只需將它們放在整數空間中。

+0

請不要投下這個答案!它解釋了爲什麼Java語言設計者認爲將switch語句限制爲32位類型是合理的。 – palm3D 2008-11-21 10:07:32

+3

這不是一個理由,它是猜測。長時間投射整數空間也會破壞使用長整數的目的。 – 2008-11-21 12:25:42

+0

這將是一個非常愚蠢的原因,想象有一些長序列需要切換。 – MightyPork 2014-04-21 19:32:40

23

如上述here,交換機使用byte,short,char和int基本數據類型。它也適用於枚舉類型和一些特殊類,它們可以「包裝」某些基本類型:Character,Byte,Short和Integer。

Java switch語句被編譯爲JVM bytecode tableswitch or lookupswitch。這兩個字節碼都要求case值是唯一的,32位整型編譯時常量。

tableswitch和lookupswitch指令都包含一個默認分支偏移量和一組可變長度的case值/分支偏移量對。
兩條指令都從堆棧中彈出密鑰(緊跟在switch關鍵字後面的括號中的表達式的值)。
的關鍵是與所有的情況下的值相比:

  • 如果發現匹配,與殼體值取該分支相關聯的偏移。
  • 如果找不到匹配項,則採用默認分支偏移量。

儘管上述表示的實施細則,我相信用於開關的類型是一個有效率的字節碼的控制流兼容,它可能是這樣選擇的原因的重要組成部分。

我想你可以允許Java switch語句的情況下,以包括其他類型的值,並編譯使用這些類型的值的一成其他字節碼switch語句,例如:

在本Java Bug說作爲ifs和gotos的序列。但是,我們必須仔細檢查所有switch語句,以確定它是否會編譯爲快速切換字節碼或慢速if-else序列。

在本其他Java bug

「開關」說語句可以使用功能表調度和/或二進制樹搜索更快匹配的情況下發言,而不是隻是爲了測試他們一個接一個。

0

我的猜測是,由於長操作變量may not be atomic上的操作,long被認爲是有效的開關表達式類型。

1

Scala是一種構建在JVM之上的語言,允許您定義自己的case類,您可以在switch語句中使用它。因此,在switch語句中使用long或double或者Strings肯定是可能的。但是我不知道它有多複雜和多麼有效。使用簡單的類型,編譯器只是計算在表上跳轉的偏移量。更復雜的類型絕對不是這種情況。

我想這個答案與java的設計時間和設計者試圖達到的目標有關。 Java的最初目標是設計一個「更好的C++」,在許多環境中可移植。我可以理解爲什麼複雜類型的開關不適合它。

0

如果您發現本機java開關結構太多限制,請查看lambdaj Switcher,它允許聲明性地通過將任何對象與一些hamcrest matchers。