2012-12-19 25 views
2

可能重複:
Why can’t your switch statement data type be long, Java?爲什麼Java不能長時間切換原語?

爲什麼這樣的事情不可能?

private void importantFunction(long arg1) { 

    switch (arg1){ 
    case 0: 
     // do stuff 
     break; 
    case 1: 
     // do other stuff 
     break; 
    default: 
     //do default stuff 
     break; 
    } 
} 

我理解long值的方式,它們和整數之間不應該有太大差別。

+9

http://stackoverflow.com/questions/2676210/why-cant -your-switch-statement-data-type-be-long-java – bartlaarhoven

+0

「爲什麼這樣的事情不可能?」它是我喜歡的Java語言之一,它旨在儘可能避免引入設計缺陷。如果你正在切換一個長期的價值,你做錯了什麼。 – Gimby

+0

好吧,如果我要在大量數值之間切換,那麼這可能是一個糟糕的決定。但在我的情況下,我正在使用專有的API,這給了我很長的價值。我只是檢查值是否爲0,1或者還沒有設置,而簡單的演員就能以簡單的方式解決這個問題,但我很好奇Java爲什麼不允許它。具有整數值的糟糕設計可能沒有任何困難。 Integer類支持2 * 2^31-1不同的值。 –

回答

2

JVM spec says: Java虛擬機的tableswitch和lookupswitch指令僅對int數據操作。

0

因爲Java不希望你切換的許多選項作爲一個長期可以包含,所以它僅限於整數

+1

這將是一個尷尬的解決方案,因爲整數可以包含值最大爲2^31-1 –

3

按Java 7,你可以使用一個字符串:LINK TO ORACLE

所以basicly這將允許String.valueOf(23423423L);

3

Java可能有許多,許多功能。語言設計是效用與複雜性之間的一系列連續的權衡。放入太多的功能,語言變得很難學習和實施。

顯然,可以有一個很長的只有少數可能的值,所以它是合理的使用它作爲開關表達式,但這是不尋常的。主要是,當int的值太多時,會使用long,對於switch表達式來說,太多的值是太多的。

一種解決方案是映射的值的地圖多久,你想用一個小套的整數值:

import java.util.HashMap; 
import java.util.Map; 

public class Test { 
    public static void main(String[] args) { 
    final int ONE_CASE = 3; 
    final int ANOTHER_CASE = 4; 
    Map<Long, Integer> map = new HashMap<Long, Integer>(); 
    map.put((long) 1e10, ONE_CASE); 
    map.put((long) 1e11, ANOTHER_CASE); 
    long arg1 = (long) 1e11; 
    switch (map.get(arg1)) { 
    case 3: 
     System.out.println("ONE_CASE"); 
     break; 
    case 4: 
     System.out.println("ANOTHER_CASE"); 
     break; 
    } 
    } 
} 
+0

+1的唯一性的答案.. – aProgrammer

相關問題