使用规则如下case
:
case表达式必须计算为Compile Time Constant
。
case(t)表达式必须与switch(t)具有相同的类型,其中t是类型(字符串)。
如果我运行此代码:
public static void main(String[] args) {
final String s=new String("abc");
switch(s)
{
case (s):System.out.println("hi");
}
}
它给出Compile-error为:"case expression must be a constant expression"
另一方面,如果我尝试使用final String s="abc";
,它可以正常工作。
据我所知,String s=new String("abc")
是对String
位于堆上的对象的引用。并且s
它本身是一个编译时常量。
这是否意味着final String s=new String("abc");
不是编译时间常数?
用这个,
String s= new String("abc");
final String lm = "abc";
switch(s)
{
case lm:
case "abc": //This is more precise as per the comments
System.out.println("hi");
break;
}
根据文档
基本类型或String类型的变量是最终变量,并使用编译时常量表达式(第15.28节)进行了初始化,该变量称为常量变量
问题是您的代码final String s= new String("abc");
未初始化常量变量。
问题内容: 除了看起来不太好以外,是否有其他替代方法可以在Java中实现切换案例。根据选择必须执行的方法,一组值会组合在一起。 问题答案: 想必您正在努力满足案件不变的要求。通常,这是代码气味,但是您可以做一些事情。您可能想提出并链接到另一个详细说明您为何尝试切换的问题。 在上面的示例中,您可能想要映射到“处理程序”,例如 然后,这一切都变成了查找。 同样,这有点气味,因此请发布一个说明原因的问题
Apache Camel(在JavaDSL)中是否有类似于Java开关盒的构造? 例如: 可以翻译成更类似于switch的东西吗?我的意思是,我不想使用简单的谓词,只使用body元素类型的值。还是我的方法完全错了?(这可能是合理的)
> case表达式的计算值必须为。 case(t)表达式必须具有与switch(t)相同的类型,其中t是类型(字符串)。 如果运行此代码: 是否意味着不是编译时间常量?
有人能建议我如何替换下面的代码吗? 如何重写代码以避免重复块{code>case 3:{code block A;break;} ? 如何将案例1和案例3的代码组合起来?
问题内容: 因此,如果我有一个,由于某种原因,如果我在另一段代码(如)中引用它,则在编译过程中它不会内联到代码中。因此,它不是在被编译之后而是。 问题答案: 您不是编译时间常数,因为JLS 表示 不是。只能在常量表达式中使用的类型是基本类型和。 它的意义是,一个实例(通常)具有语义上重要的对象标识,该标识将其与其他实例区分开。此对象标识不能编码在类文件中……至少,不能用当前的类文件格式编码。(如果
问题内容: 最终变量和编译时间常数之间有什么区别? 考虑以下代码 这是什么意思?何时以及如何为最终变量分配值?在运行时会发生什么,在编译时会发生什么?为什么要给switch一个编译时间常数?Java还有哪些其他结构需要编译时间常数? 问题答案: 问题在于, 所有语句在编译时 都 必须是最终的 。您的第一个陈述 是最终决定 。对于100%,除以外没有其他值。 然而,这 不能保证 对。如果周围有一个i