返回

Java Switch 赋值技巧: 增强型 vs 传统方法

java

Java 中使用 Switch 语句赋值变量的技巧

在 Java 中,switch 语句用于根据变量的不同值执行不同的代码块。 传统上,在 switch 语句中给变量赋值可能会遇到一些限制。问题核心在于传统 switch 语句结构并非直接设计为返回值的形式,使得在单个 case 中为外部变量赋值颇为不便。尽管如此,借助一些技巧,还是能够有效解决这一问题。

问题分析

如问题示例代码所示, 传统的switch语句在处理变量赋值时会显得笨拙。 在每个case块中使用 break 语句跳转是一种解决方案。但这意味着需要多次初始化同一个变量,代码重复且不够简洁,可维护性不高。 switch 设计上用于多路分支控制而非表达式求值。它不像条件运算符 ?: 或 lambda 表达式可以直接产生一个值,这就造成了上述的赋值困境。

另外,在引入增强型的 switch 语句(switch expressions)之前,给 switch 赋值也存在不少障碍。传统 switch 要求所有 case 语句块后加 break 声明, 增加了代码的复杂度,尤其在有多个赋值路径时。增强型 switch 语句使用 -> 代替 :break, 让逻辑更为直观且易于管理。

解决方案

有两种主要方法解决这个难题。 第一种方法是利用增强型的 switch 表达式,它可以像表达式一样直接返回值。另一种方法是使用传统的 switch 语句,结合 return 或赋值语句实现目标,尽管需要稍微多一些步骤。

方案一:利用增强型 Switch 表达式

自 Java 14 之后,引入了增强型 switch 表达式,它可以直接返回值。这种方式消除了传统 switch 语句的 break 语句,代码更简洁,更接近赋值变量的目标。

代码示例:

public class SwitchAssignment {

    public static void main(String[] args) {
        int number = 5;
        String numberInWord = getNumberInWord(number);
        System.out.println(numberInWord); // 输出: FIVE
    }

    public static String getNumberInWord(int number) {
        String inWord = switch (number) {
            case 0 -> "ZERO";
            case 1 -> "ONE";
            case 2 -> "TWO";
            case 3 -> "THREE";
            case 4 -> "FOUR";
            case 5 -> "FIVE";
            case 6 -> "SIX";
            case 7 -> "SEVEN";
            case 8 -> "EIGHT";
            case 9 -> "NINE";
            default -> "NO VALUE";
        };
        return inWord;
    }
}

操作步骤:

  1. 编写一个返回类型与待赋值变量一致的方法 (getNumberInWord,这里是String类型)。
  2. 在方法内使用增强型的 switch 表达式,每个 case 使用 -> 后跟返回值。
  3. switch 表达式的返回值赋给变量并返回。

原理: 增强型 switch 表达式将 switch 语句转换为表达式形式,允许 switch 根据 case 的匹配结果直接返回一个值。

方案二:使用传统 Switch 语句(略复杂)

对于 Java 14 之前的版本, 或部分场景仍然偏爱传统 switch,可以通过提前声明变量,在各个 case 语句块中赋值来实现。

代码示例:

public class SwitchAssignmentOld {

    public static void main(String[] args) {
        int number = 3;
        String numberInWord = getNumberInWord(number);
        System.out.println(numberInWord);
    }
    public static String getNumberInWord(int number) {
        String inWord;
         switch (number) {
            case 0:
               inWord = "ZERO";
                break;
            case 1:
                inWord = "ONE";
                break;
            case 2:
                inWord = "TWO";
                break;
             case 3:
               inWord = "THREE";
               break;
            case 4:
                inWord = "FOUR";
               break;
            case 5:
                 inWord = "FIVE";
                 break;
            case 6:
                 inWord = "SIX";
                 break;
            case 7:
                inWord ="SEVEN";
                break;
            case 8:
               inWord = "EIGHT";
                break;
            case 9:
                 inWord = "NINE";
                break;
            default:
               inWord = "NO VALUE";

        }

         return inWord;
    }
}

操作步骤:

  1. switch 语句之外,提前声明一个需要赋值的变量 (inWord),
  2. 在每个 case 语句块中,将对应的值赋给该变量。注意 case 末尾务必添加break , 防止 case 穿透。
  3. 使用 default 子句捕获不在指定范围的值。

原理: 这种方式利用传统 switch 分支判断的机制,在不同 case 中修改同一变量的值,实现了基于 switch 的变量赋值效果。虽然较为繁琐, 但提供了向下兼容和处理复杂逻辑的可能。

安全提示

使用 switch 语句时,始终确保涵盖所有可能的情况。添加 default 子句可以防止出现未定义的值,特别是在传统switch 的应用场景。 增强型的switch 虽然能默认返回 default 子句, 但合理利用默认行为也有助于代码稳健性。此外,在使用 switch 语句赋值变量时, 也要注意赋值类型的兼容性,以免发生类型转换异常。对于复杂的赋值逻辑,考虑函数抽象以避免逻辑嵌套过多,提升代码清晰度和可维护性。