2015-11-05 93 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"); 
} 
...