OOP

存在潜在的兼容性问题

image-20241211234823806

Switch 模式匹配

  1. 模式匹配扩展到 switch 语句switch 表达式
  2. 允许测试多个模式,每个模式都可以有特定的操作
1
2
3
4
5
6
public static boolean isSquare(Shape shape) {
return switch (shape) {
case null, Shape.Circle c -> false;
case Shape.Square s -> true;
};
}

扩充的匹配类型

  1. 在 JDK 17 之前,switch 关键字可以匹配的数据类型 - 数字 + 枚举 + 字符串 - 本质上是整型原始类型
  2. 在 JDK 17 开始,支持引用类型

支持 null - 不会抛出 NPE - 在 JDK 17 之前需要先判空

1
2
3
4
5
6
7
8
9
10
public static boolean isSquare(Shape shape) {
if (shape == null) {
return false;
}

return switch (shape) {
case Shape.Circle c -> false;
case Shape.Square s -> true;
};
}

类型匹配

  1. 类型匹配来说,switch 要匹配的数据是一个引用
  2. 类型匹配时,还能获得匹配变量 - 不再需要强制转换 - 降低维护成本

穷举

  1. 使用 switch 表达式,需要穷举所有场景,否则编译器报错
  2. 问题提前暴露,降低代码维护成本

image-20241212000936202

性能优化

  1. 使用 if-else 的处理方式,每一个场景,都至少对应一个 if-else 语句,顺序执行 - 时间复杂度为 O(N)
  2. 使用 switch 模式匹配,不需要顺序执行 - 时间复杂度为 O(1)

default - 总能穷举所有场景,但丧失了检查匹配场景有没有变更的能力

1
2
3
4
5
6
public static boolean isSquare(Shape shape) {
return switch (shape) {
case Shape.Square s -> true;
case null, default -> false;
};
}