开关模式中的枚举导致使用错误的大小写[已关闭]

问题描述 投票:0回答:1

在 Java 21 中运行,以下代码有效,按照我的预期打印“D2”:

public class EnumSandboxTest {

    public static void main(String[] args) {
        TestEnum test = TestEnum.D; 
        String par = "9999";
        switch (test)
        {
            case D: 
                System.out.println(par.length() < 5 ? "D2" : "D");
                break;
            case E: 
                System.out.println(par.length() < 4 ? "E2" : "E");
                break;
            default: System.out.println("EMPTY (DEFAULT)");
        };
    }   
    private enum TestEnum
    {
        D,E;
    }
}

但是,如果我将 switch 语句更改为使用表达式和模式匹配:

switch (test)
{
    case D -> System.out.println("D");
    case E -> System.out.println("E");
    case TestEnum p when p.equals(TestEnum.D) && par.length() < 5 -> System.out.println("D2");
    case TestEnum p when p.equals(TestEnum.E) && par.length() < 4 -> System.out.println("E2");
    default -> System.out.println("EMPTY (DEFAULT)");
};

那么输出是“E”而不是“D2”。为什么?

java enums switch-statement
1个回答
0
投票

在第二个 switch 语句中,您首先检查

test
D
匹配的情况,箭头表示该情况在匹配时应该产生/返回。由于您测试
test
TestEnum.D
,它确实匹配,并且您的程序正在返回
System.out.println("D")

它永远不会循环到其他情况。如果您首先测试案例

TestEnum p when p.equals(TestEnum.D) && par.length() < 5 -> System.out.println("D2")
,在案例
D
之上,那么您将得到
D2

© www.soinside.com 2019 - 2024. All rights reserved.