当前位置: 首页 > 面试题库 >

切换案例Java中的编译时间常数用法

陆翔飞
2023-03-14
问题内容

使用规则如下case

  1. case表达式必须计算为Compile Time Constant

  2. 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