在 Java 17 switch-case 中使用 Final 变量的好处

Jot*_*otA 2 java switch-statement constant-expression java-17

有人可以告诉我 Java 17 接受最终表达式作为 switch-case-constructs 中的 case 表达式但不接受最终表达式作为参数传递的好处吗?

    void test(int distinction, final int foo) {
        final var bar = 2;
        
        switch (distinction) {
        case foo -> doSomething(); // does not compile -> case expressions must be constant expressions
        case bar -> doSomething(); // does compile
        case 3 -> doOtherThings(); // does compile
        }
    }
Run Code Online (Sandbox Code Playgroud)

尽管 foo 和 bar 一样是最终变量,为什么编译器不接受情况 1?

在我看来,案例 3 的可读性比案例 2 好得多。所以我没有看到新语言结构的好处。

Bri*_*etz 12

Case 标签必须是编译时常量。最终参数不是编译时常量;它可能不会因方法的给定调用而变化,但可能会因方法的调用而变化。(最终实例字段和没有初始化程序的静态最终字段也不是编译时常量。)