Java中switch 的替代方案

news/2025/3/19 17:02:12/文章来源:https://www.cnblogs.com/ljwking/p/18775883

一、为什么需要替代 switch

  1. 类型限制
    传统 switch 仅支持 intcharenum(Java 5+)和 String(Java 7+)。若需要更复杂的条件(如对象类型、模式匹配),需其他方式。

  2. 代码冗余与维护困难
    每个 case 需要手动添加 break,否则会引发“穿透”(fall-through),容易导致逻辑错误。

  3. 扩展性差
    新增分支需修改原有代码,违反“开闭原则”(对扩展开放,对修改关闭)。

  4. 不够面向对象
    大量 switch 可能表明设计未充分利用多态性,违背面向对象设计原则。

 

二、替代方案分类

  

场景替代方案核心思想
简单分支逻辑 枚举(Enum)+ 方法 将逻辑绑定到枚举实例
动态策略选择 策略模式(Strategy) 用接口抽象行为,动态切换实现
键值映射关系 Map + 函数式接口 用哈希表存储行为映射
类型驱动的多态行为 多态(Polymorphism) 利用继承和重写替代条件判断
Java 14+ 新特性 模式匹配的 switch 表达式 更简洁的语法和模式匹配

 

三、替代方案实例

枚举(Enum)+ 方法绑定

  适用场景:分支逻辑与固定常量强关联(如状态机、错误码处理)。
  优势:逻辑内聚,避免分散的 case 判断。
  示例:

public enum Operation {ADD {@Overridepublic int apply(int a, int b) {return a + b;}},SUBTRACT {@Overridepublic int apply(int a, int b) {return a - b;}};public abstract int apply(int a, int b);
}// 使用
Operation op = Operation.ADD;
int result = op.apply(5, 3); // 8

 

 

策略模式(Strategy Pattern)

  适用场景:动态选择算法或行为,需灵活扩展。
  优势:解耦策略定义与使用,符合开闭原则。
  示例

// 策略接口
interface PaymentStrategy {void pay(double amount);
}// 具体策略
class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("信用卡支付: " + amount);}
}class AlipayPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("支付宝支付: " + amount);}
}// 上下文类(策略使用者)
class PaymentContext {private PaymentStrategy strategy;public void setStrategy(PaymentStrategy strategy) {this.strategy = strategy;}public void executePayment(double amount) {strategy.pay(amount);}
}// 使用
PaymentContext context = new PaymentContext();
context.setStrategy(new AlipayPayment());
context.executePayment(100.0); // 输出:支付宝支付: 100.0

 

 

Map + 函数式接口(Lambda/方法引用)

  适用场景:键值映射的简单逻辑(如命令模式、配置驱动)。
  优势:代码简洁,动态注册行为。
  示例

import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;public class CommandPattern {private static final Map<String, Consumer<String>> COMMANDS = new HashMap<>();static {COMMANDS.put("start", param -> System.out.println("启动服务,参数: " + param));COMMANDS.put("stop", param -> System.out.println("停止服务,参数: " + param));}public static void execute(String command, String param) {Consumer<String> handler = COMMANDS.getOrDefault(command, p -> System.out.println("未知命令: " + command));handler.accept(param);}public static void main(String[] args) {execute("start", "8080"); // 启动服务,参数: 8080execute("delete", "data"); // 未知命令: delete
    }
}

 

 

多态(继承与方法重写)

  适用场景:类型驱动的行为差异(如不同子类的不同实现)。
  优势:天然面向对象,消除条件判断。
  示例:

abstract class Animal {abstract void makeSound();
}class Dog extends Animal {@Overridevoid makeSound() {System.out.println("Woof!");}
}class Cat extends Animal {@Overridevoid makeSound() {System.out.println("Meow!");}
}// 使用
Animal animal = new Dog();
animal.makeSound(); // Woof!

 

 

 Java 14+ 的 switch 表达式与模式匹配

  适用场景:简化传统 switch,支持更灵活的模式匹配。
  优势:语法简洁,支持返回值,避免 break 穿透。
  示例(Java 17 模式匹配)

// switch 表达式(返回结果)
String day = "MON";
String type = switch (day) {case "MON", "TUE", "WED", "THU", "FRI" -> "工作日";case "SAT", "SUN" -> "周末";default -> throw new IllegalArgumentException("未知日期: " + day);
};
System.out.println(type); // 工作日// 模式匹配(Java 17+ 预览特性)
Object obj = "Hello";
String result = switch (obj) {case Integer i -> "整数: " + i;case String s && !s.isEmpty() -> "字符串: " + s;case null -> "null值";default -> "未知类型";
};
System.out.println(result); // 字符串: Hello

 

 

四、方案对比与选择建议

方案适用场景优点缺点
枚举 + 方法 固定常量的行为绑定 逻辑内聚,类型安全 枚举类可能膨胀
策略模式 动态切换复杂算法 高扩展性,符合开闭原则 类数量增加
Map + 函数式接口 简单键值映射或配置驱动逻辑 灵活,易维护 不适合复杂逻辑
多态 类型驱动行为差异 面向对象,消除条件判断 需预先设计继承结构
switch 表达式 简化传统分支逻辑 语法简洁,支持返回值 需 Java 14+

 

选择建议

  1. 简单分支 → 使用 switch 表达式或 Map。

  2. 类型驱动 → 优先选择多态。

  3. 动态策略 → 策略模式或工厂模式。

  4. 固定常量逻辑 → 枚举绑定方法。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901596.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20242428 实验一《Python程序设计》实验报告

学号20242428《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2424 姓名: 虎岳 学号:20242428 实验教师:王志强 实验日期:2025年3月19日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序,并进行调试…

记录一次PG数据库连接数超最大值问题

报错内容: nested exception is org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections排查手段 : SELECT COUNT(*) FROM pg_stat_activity; 查询活跃的连接 SHOW max_connections; 查询数…

StarRocks 升级注意事项

前段时间升级了生产环境的 StarRocks,从 3.3.3 升级到了 3.3.9,期间还是踩了不少坑所以在这里记录下。因为我们的集群使用的是存算分离的版本,也是使用官方提供的 operator 部署在 kubernetes 里的,所以没法按照官方的流程进入虚拟机手动启停对应的服务。 只能使用 operato…

Grafana 添加官方模板

Refer 官方的模板地址: https://grafana.com/grafana/dashboards/ 1.进入到dashboard页面 2.点击New->Import 3.输入想要导入模板的id或者url地址都行 比如你想导入模板url地址是:https://grafana.com/grafana/dashboards/14584-argocd/ 你就可以填写上面的url地址,也可…

05C++数据类型——教学(2)

四、 数据类型.转换 教学视频 1. 数据类型类型名 类型声明 解释说明整型 int -2147483648 到 2147483647 的范围的整数长整形 long long 比上面大很多很多,这里装不下,具体搜索字符型 char 赋值只能是一个字符,比如 A,必须用单引号,双表示字符串不是字符浮点型 float 也叫…

革新科技!通过EtherCAT与Profinet网关实现温湿度监控,医药设备领域的智能革命来临!

通过网关EtherCAT---Profinet 通讯实现温湿度监控项目背景 某医药企业制药设备采用 EtherCAT 作为主控制总线,负责高速设备控制。温湿度传感器、执行器等环境监控设备基于 Profinet 通讯。 为实现机器整体环境参数的实时采集与集中监控,需要在 EtherCAT 总线与 Profinet 网络…

grafana添加跳转的超链接

1.进入到你想设置链接的dashboard中 2.选中表格-》点击Edit->进入到table 3.找到右侧栏中的 Data links -》add link:输入title和url地址,点击save 4.点击右上角的“Save dashboard”按钮保存 此时,表格中的数据点击时,就可以跳转了。

数独游戏 | 数字益智游戏①

依托国产的 AI 豆包完成的网页端的数独益智游戏。前情概要 2025年03月19日,依托豆包设计了数独游戏,嵌入到我的博客,数字益智游戏,欢迎体验。 数独游戏数独游戏.sudoku-game-container { font-family: Arial, sans-serif; display: flex; flex-direction: column; align-it…

itext5生成多个PDF并合并

PDF批量生成并合并为1个PDF 单个生成/*** 根据id查询数据* @param id 数据id* @return*/private Map<String, String> queryEntityDataById(String id) {//根据id查询Box entity = BoxService.getById(id);Map<String, String> data = new HashMap<String, Stri…

docker 容器修改端口映射

目录查看容器信息查看容器的端口映射情况,在容器外执行查找要修改容器的容器Id全称修改要端口映射的容器的配置文件查看容器信息 docker ps -a查看容器的端口映射情况,在容器外执行 docker port 容器ID 或者 docker port 容器名称查找要修改容器的容器Id全称 docker inspect …

Allure的下载安装以及自动生成测试报告

一、下载Allure压缩包 访问此链接:https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/ 根据你个人的需求,下载对应的allure版本即可,哪个兼容就下载哪个,需要哪个下载哪个。 比如,小编自己就随便下载了一个版本 下载完成之后,将下载好的安装包解…

referrerpolicy-以最小的成本实现系统的图片上传

背景 系统上传图片一般有以下三种方案:购买云存储(比如 AWS S3、阿里云 OSS、腾讯云 COS),获取图片URL 直接将图片上传到服务器,存储在本地作为静态资源 使用第三方的图片服务(比如有道、博客园),借用对方资源结合本系统需求:自建博客尽可能减少预算,方案1放弃;方案…