在 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”。为什么?
在第二个 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
。