代码之家  ›  专栏  ›  技术社区  ›  emeraldjava

Java EnUM:重构开关语句的常量表达式需要编译错误吗?

  •  15
  • emeraldjava  · 技术社区  · 15 年前

    我有一个类为我的应用程序声明常量

    public class GroupConstants {
        ..
        public static final int INTEGER_VALUE = 1;
        public static final int LONG_VALUE = 2;
        public static final int STRING_VALUE = 3;
        ..
    }
    

    代码中有一组switch语句

    private static Object getValue(String stringValue, Parameter parameter) throws InvalidPatternException
    {
        Object result=null;
        switch (parameter.getDataType())
        {
            case GroupConstants.STRING_VALUE: // String value
                result=stringValue;
            break;
            case GroupConstants.INTEGER_VALUE: // Long value
            case GroupConstants.LONG_VALUE:
            case GroupConstants.BOOLEAN_VALUE:
            case GroupConstants.DATE_VALUE:
    ..
    }
    

    我想重构要由枚举表示的int常量值

    public enum DataType {
    
        UNKNOWN_VALUE(0,"unknown"),
        INTEGER_VALUE(1,"integer"),
        LONG_VALUE(2,"long"),
        STRING_VALUE(3,"string"),
        BOOLEAN_VALUE(4,"boolean"),
    ..
    }
    

    所以我的代码可能是这样的

    @Deprecated
    public static final int INTEGER_VALUE = DataType.INTEGER_VALUE.getId();
    

    加班的时候我可以改变我的交换声明。当我更改静态final int引用以指向枚举时,所有switch语句都将中断。

    [javac] /home/assure/projects/tp/main/src/a/b/c/DDDDDManagerBean.java:1108: constant expression required
    [javac]             case GroupConstants.INTEGER_VALUE:
    [javac]                                ^
    [javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:203: constant expression required
    [javac]         case GroupConstants.INTEGER_VALUE:
    [javac]                            ^
    [javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:268: constant expression required
    [javac]             case GroupConstants.INTEGER_VALUE:
    [javac]                                ^
    [javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:316: constant expression required
    [javac]             case GroupConstants.INTEGER_VALUE:
    [javac]                                ^
    [javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:436: constant expression required
    [javac]         case GroupConstants.INTEGER_VALUE:
    

    我还不想被迫改变所有的开关,所以有一个干净的工作吗?

    4 回复  |  直到 14 年前
        1
  •  8
  •   Stephen C    15 年前

    getId() JLS 15.28 Constant Expressions

    private int INTEGER_VALUE_HOLDER = DataType.INTEGER_VALUE.getId(); 
    public static final int INTEGER_VALUE = INTEGER_VALUE_HOLDER;
    

    INTEGER_VALUE_HOLDER JLS 4.12.4 Final Variables INTEGER_VALUE

    this this.INTEGER_VALUE_HOLDER

        2
  •  10
  •   AlexR    15 年前

    DataType type = ...;
    
    switch (type) {
        case UNKNOWN_VALUE
            //do something
            break;
        case INTEGER_VALUE
            //do something
            break;
        case LONG_VALUE
            //do something
            break;
        case STRING_VALUE
            //do something
            break;
        case BOOLEAN_VALUE
            //do something
            break;
    
        3
  •  4
  •   Grzegorz Oledzki    15 年前

    GroupConstants.

     case GroupConstants.STRING_VALUE:
    

     case STRING_VALUE: