为何switch语句中使用final数组元素提示需常量表达式?
为什么switch里用
foods[0]会提示需要常量表达式? 这个问题我碰到过好多次啦,其实核心原因是Java对switch语句的表达式有严格的编译期常量要求,咱们一步步拆解清楚:
- switch的核心规则:switch括号里的表达式必须是编译期常量表达式——意思是编译器在编译代码的时候,就能100%确定它的具体值,不需要等到程序运行时才计算。
- 你的数组
final修饰的是什么?:你定义的private static final String[] foods里,final修饰的是数组的引用,而不是数组里的元素。也就是说:- 你不能把
foods指向一个新的数组(比如foods = new String[]{"A", "B"};会直接报错); - 但你完全可以在代码的任何地方修改数组里的元素,比如
foods[0] = "Noodles";,这是完全合法的。
正因为数组元素的值在运行时可能被改变,编译器没法保证foods[0]的值是固定不变的,所以它不符合switch要求的常量表达式。
- 你不能把
- 那什么样的写法才合规?:如果把单个元素定义为独立的
static final常量就可以,比如:
因为这里的private static final String PASTA = "Pasta"; // 这样在switch里用就完全没问题 switch(PASTA) { case "Pasta": // 你的业务逻辑 break; }PASTA是编译期常量,编译器能确定它的值永远不会变(String是不可变类型,且用字面量赋值+final修饰)。
内容的提问来源于stack exchange,提问作者Edwin Carlsson
相关产品推荐
相关产品推荐

