2015-11-05 33 views
1

有沒有一種方法可以在switch語句中定義一個常量Map?我的所有試驗都使用靜態地圖here,here和其他地方都沒有成功。爲什麼地圖不變?在switch語句中選擇case的常量映射?

對於行case (kws.get(KEYWORD_NAME)):我總是得到constant string expression required錯誤。

public class Demo { 

    public static final String KEYWORD_NAME = "Name"; 
    public static final String KEYWORD_TYPE = "Type"; 

    private static final Map<String, String> kws = Collections.unmodifiableMap(
    new HashMap<String, String>() {{ 
    put(KEYWORD_NAME, KEYWORD_NAME.toLowerCase()); 
    put(KEYWORD_TYPE, KEYWORD_TYPE.toLowerCase()); 
    }}); 

    public static void parse(String kw){ 
    switch(kw){ 
     case (kws.get(KEYWORD_NAME)): 
     System.out.println("Test"); 
     break; 
    default: 
     System.out.println("Unknown"); 
    } 
    } 
} 
+3

' case'表達式必須是*編譯時常量*。你如何期望編譯器知道'kws.get(KEYWORD_NAME)'會做什麼? –

+1

每個'switch'語句都可以使用Map完成。例如,你可以創建一個'Map '。 Java 8方法的引用使得這非常簡單。 – VGR

回答

7

不,因爲switch語句中的case標籤必須是常量表達式或枚舉數。

對您的地圖的引用是final,並且您的地圖是不可修改的。但是後者的執行時間爲,運行時間爲。編譯器不會將該對象視爲常量。

Java Language Specification, 14.11: The switch statement

SwitchLabel: 
case ConstantExpression : 
case EnumConstantName : 
default : 

常量表達式只能的原始和字符串,某些運營商無副作用,常量變量,並且可以在編譯時被計算的幾個其它部件組成。 (常量變量是初始化爲常量表達式的基本類型或字符串類型的final變量。)更多詳細信息,請參閱15.28: Constant expressions

0

我不知道你的使用情況,但使用的不可修改的地圖,你可以使用參數化的枚舉:

>>時:

public enum Demo { 
    NAME("Name"), 
    TYPE("Type"), 
    NOT_SUPPORTED(""); 

    private String code; 
    private static final Map<String, Demo> CODE_VALUE_MAP = new LinkedHashMap<>(); 

    // -- static 
    static { 
     for (Demo demo : Demo.values()) { 
      CODE_VALUE_MAP.put(demo.getCode(), demo); 
     } 
    } 

    public static Demo forCode(@NotNull String code) { 
     if (code!= null) { 
      return CODE_VALUE_MAP.getOrDefault(code.toUpperCase(), NOT_SUPPORTED); 
      } 
      return NOT_SUPPORTED; 
     }  
    } 

    // -- constructor 
    Demo(String code) { 
     this.code= code; 
    } 

    // -- public methods 
    public String getCode() { 
     return code; 
    } 
} 

>>然後:

... 
public static void parse(String kw){ 
Demo demo = Demo.forCode(kw); 
switch(demo){ 
    case NAME: 
    System.out.println("Test"); 
    break; 
default: 
    System.out.println("Unknown"); 
} 
...