Discuss / Java / case Weekday.Mon.dayValue :会报Constant expression required错误

case Weekday.Mon.dayValue :会报Constant expression required错误

Topic source

丶IF73666

#1 Created at ... [Delete] [Delete and Lock User]

**我想做的是 输入enum对象对应的那个int值或string值,得到这个enum对象。
**

问题:

**case Weekday.Mon.dayValue :会报Constant expression required错误 百度了一下说错误的原因是由于编译器未能在编译期间拿到这个值所以报错。
**

百度了解决办法,网友给出的解答是:这个值没有被final修饰。加上final就好了。

但是我enum类weekday中定义dayValue时明明就有final修饰啊。依旧是报这个错。如果有懂的同学,可以给我解答一下嘛?

我现在用的另一种方式实现这个想法:

主函数中:

  System.out.println("输入一个整数");

        int chose = scanner.nextInt();

        Weekday day1 = enumChose(chose);

        System.out.println(day1);//  输入1 输出结果是 MON 1 星期一        输入9 输出结果:null

enumChose()静态方法中:

 public static Weekday enumChose(int chose){

        Weekday day = null;

        for(Weekday w : Weekday.values()){

            if(w.dayValue==chose){ //匹配enum的dayValue字段

                day = w;

                break; //查找到该对象,返回

            }

        }

        return day;

    }

weekday中:

enum Weekday {

    MON(1, "星期一"), TUE(2, "星期二"), WED(3, "星期三"), THU(4, "星期四"), FRI(5, "星期五"), SAT(6, "星期六"), SUN(0, "星期日");

    public final int dayValue;

    private final String chinese;

    private Weekday(int dayValue, String chinese) {

        this.dayValue = dayValue;

        this.chinese = chinese;

    }

    public int getDayValue() {

        return dayValue;

    }

    public String getChinese(){

        return chinese;

    }

    @Override

    public String toString() {

        if(this==null) return "null";

        return name()+" "+dayValue+" "+chinese;

    }

}

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

case只能比较常量,不能比较变量,所以要在编译期计算常量的值。

这种final定义:

class X {
    static final int y = 1;
}

编译期能计算出来,所以可以用 case X.y,编译器麻溜地把代码直接替换成 case 1

这种final定义:

class X {
    static final int y = Integer.parseInt(System.getProperty("NUMBER_OF_PROCESSORS"));
}

编译期算不出来,只能运行才知道,所以不能用case X.y

Little虔

#3 Created at ... [Delete] [Delete and Lock User]

按照廖老师的说法,case只能比较常量,而常量在编译之前就已经要确定下来了。你的输入是在程序编译完成之后,程序运行了,这时候才能输入,得到常量的值是在编译之后才能确定的。


  • 1

Reply