当前位置: 首页 > web >正文

Java 流程控制 switch:从实际场景出发掌握选择艺术

 

🔥「炎码工坊」技术弹药已装填!
点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】

 


一、问题驱动:如何优雅处理多个固定值的条件判断?

假设你正在开发一个「智能闹钟」应用,需要根据用户设置的星期几(如周一、周三、周五)播放不同的提醒音。你会如何实现?

如果用 if-else 实现,代码可能如下:

String day = "周三";
if (day.equals("周一")) {System.out.println("播放早起音乐");
} else if (day.equals("周三")) {System.out.println("播放学习提示");
} else if (day.equals("周五")) {System.out.println("播放放松歌曲");
} else {System.out.println("无匹配提醒");
}

虽然功能正确,但当条件分支增多时,代码会显得冗长且难以维护。此时,switch 语句的优势就显现出来了。


二、switch 入门:简洁的多分支选择

1. 基础语法(JDK 7+ 支持 String 类型)

public class SwitchExample {public static void main(String[] args) {String day = "周三";switch (day) {case "周一":System.out.println("播放早起音乐");break;case "周三":System.out.println("播放学习提示");break;case "周五":System.out.println("播放放松歌曲");break;default:System.out.println("无匹配提醒");}}
}

运行结果: 

播放学习提示

2. 代码解析

  • switch 表达式day 的值会被逐个匹配 case
  • case 分支:每个 case 对应一个固定值(如 "周三")。
  • break 关键字:防止「case 穿透」(fall-through),即匹配后继续执行后续分支。
  • default 分支:兜底逻辑,处理未匹配的情况。

三、对比 if-else 与 switch 的优缺点

场景switch 优势if-else 优势
固定值判断代码简洁,可读性强,性能更优(跳转表优化)可实现,但冗长
范围判断(如分数段)不支持(需配合 if-else更灵活,支持逻辑运算符(&&, `
复杂条件组合不适用首选(如 age > 18 && role == "admin"

示例对比: 

  • 场景:判断成绩等级(90-100为A,80-89为B,70-79为C) 
    • switch 实现(需嵌套):
      int score = 85;
      switch (score / 10) {case 10:case 9:System.out.println("A");break;case 8:System.out.println("B");break;default:System.out.println("C");
      }
    • if-else 实现
      if (score >= 90) {System.out.println("A");
      } else if (score >= 80) {System.out.println("B");
      } else {System.out.println("C");
      }

四、switch 执行流程图解

          +-------------------+|   开始执行switch  |+-------------------+|v+-------------------+| 匹配第一个case值  |+-------------------+|+----------v----------+| 是否匹配当前case? |+----------+----------+|否           | 是+-------------v-------------+| 进入default分支(若存在) |+-------------+-------------+|是           | 执行对应case代码块+-------------v-------------+| 是否遇到break或结束?   |+-------------+-------------+|否           | 是+-------------v-------------+| 继续执行下一个case代码块 |+-------------+-------------+|v+-------------------+|     结束switch    |+-------------------+

五、最佳实践与注意事项

  1. 避免 case 穿透:务必在每个 case 结尾加 break,否则会连续执行后续分支。
  2. 默认兜底:添加 default 分支处理意外情况。
  3. 数据类型限制: 
    • 支持:byteshortintcharString(JDK 7+)、enum(JDK 5+)。 
    •  不支持:floatdouble(精度问题)、long(可能引发歧义)。
  4. 常量匹配case 后必须是字面量或编译时常量(如 final static String)。

六、总结:何时选择 switch

  • 适用场景: 
    • 条件是有限的几个固定值(如星期、状态码、枚举)。 
    • 需要代码简洁性和可读性。
  • 替代方案: 
    •  条件涉及范围、复杂逻辑时,优先用 if-else。 
    • 需要动态条件时,考虑策略模式或映射表(如 Map)。

通过 switch,你可以将复杂的分支逻辑转化为清晰的表格式结构,让代码更易维护!

 

🚧 您已阅读完全文99%!缺少1%的关键操作:
加入「炎码燃料仓」
🚀 获得:
√ 开源工具红黑榜 √ 项目落地避坑指南
√ 每周BUG修复进度+1%彩蛋
(温馨提示:本工坊不打灰工,只烧脑洞🔥)

 

http://www.xdnf.cn/news/8827.html

相关文章:

  • 详解Mysql redo log与binlog的两阶段提交(2PC)
  • 上海医日健集团社区 + 写字楼全域覆盖便民服务网
  • 如何在Windows右键菜单中添加“在此处以管理员身份打开Powershell窗口”的选项(含图标设置)
  • 论文阅读:arxiv 2024 SmoothLLM: Defending LLMs Against Jailbreaking Attacks
  • NNG和DDS
  • Ubuntu 22.04 高效Python依赖管理指南
  • 小程序使用web-view 修改顶部标题 安全认证文件部署在nginx
  • 疫情社区管理登记系统
  • 基于点标注的弱监督目标检测方法研究
  • springboot中拦截器配置使用
  • NeuralRecon技术详解:从单目视频中实现三维重建
  • 「OC」源码学习——KVO底层原理探究
  • 批量获取电商商品数据的解决方案|API接口自动化商品采集|item_get 接口详解
  • Vue.js教学第十五章:深入解析Webpack与Vue项目实战
  • 消息队列的使用
  • ClickHouse讲解
  • Qwen2.5 VL 自定义模型的回复数量
  • 基于文本挖掘与情感分析的B站《唐探1900》弹幕研究
  • Qt for Android 安卓低功耗蓝牙(BLE)开发环境搭建
  • 打卡day36
  • HUAWEI交换机配置镜像口验证(eNSP)
  • --legacy-peer-deps 是什么意思
  • 【不背八股】1.if __name__ == “__main__“ 有什么作用?
  • 【redis】redis和hiredis的基本使用
  • RabbitMQ 可靠性保障:消息确认与持久化机制(一)
  • day01
  • 算法打卡第六天
  • C++23 对部分特性的 constexpr 支持
  • 历年华南理工大学保研上机真题
  • 阿里千问系列:Qwen3技术报告解读(下)