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

Java 中消除 If-else 技巧总结

“过于依赖 if-else 不仅会让代码变得臃肿不堪,还会使维护成本大大增加。其实,if-else 虽然是最基础的条件分支,但它并不是万能的解决方案。简单粗暴的 if-else 很容易让代码可读性差、结构复杂。

今天,我将带大家了解一些取代 if-else 的设计模式和优化技巧,让你的代码既优雅又高效,再也不用担心因为写 if-else 而被吐槽了!


初级陷阱:不必要的 Else 块

很多开发者一开始都会习惯性地使用 if-else 进行简单的逻辑判断,尤其是当代码流程需要处理多种情况时。然而,这种做法其实可以更加简化。来看一段代码:

if (isValid) {// 执行某个逻辑
} else {// 执行其他逻辑
}

在这种情况下,else 块其实是多余的。我们可以通过提前返回或者直接抛出异常的方式来消除 else,从而提高代码的可读性。

改进后的代码:
if (!isValid) {// 提前返回或者抛出异常return;
}
// 执行逻辑,无需 else

通过去掉不必要的 else 块,代码的层级变浅,看起来更加清晰,逻辑也更加简洁。


高级技巧:使用字典代替 If-Else

假设我们有一个功能,要求根据不同的输入执行不同的操作。初级开发者通常会用多个 if-else 或者 switch-case 来处理不同的分支逻辑:

if (type.equals("A")) {// 执行 A 操作
} else if (type.equals("B")) {// 执行 B 操作
} else if (type.equals("C")) {// 执行 C 操作
} else {// 默认操作
}

随着时间的推移,当更多的分支被添加进来时,代码将变得难以维护。每次添加新逻辑,都必须修改现有代码。为了避免这种情况,我们可以使用一个策略模式,或者更简单地,使用字典来替代 if-else

改进后的代码:
Map<String, Runnable> actions = new HashMap<>();
actions.put("A", () -> executeA());
actions.put("B", () -> executeB());
actions.put("C", () -> executeC());actions.getOrDefault(type, () -> executeDefault()).run();

这样,当我们需要添加新逻辑时,只需向字典中添加新的键值对即可。代码结构不仅简洁,还遵循了“开放-关闭”原则,减少了对现有代码的修改。


保护子句:前置条件检查

在很多场景下,代码逻辑中需要进行一系列前置条件的检查。如果这些条件不满足,就直接停止执行。在这种情况下,我们通常会用多层 if-else 来处理逻辑,但这样的代码不仅繁琐,还容易出错。

来看下面这个示例:

if (param != null) {if (param.isValid()) {if (param.isInRange()) {// 执行主要逻辑}}
}

这种层层嵌套的 if 很容易让代码失去可读性。我们可以通过“保护子句”的方式来提前结束不符合条件的逻辑,从而简化代码结构。

改进后的代码:
if (param == null || !param.isValid() || !param.isInRange()) {return;
}
// 执行主要逻辑

通过这种方式,代码流程更加简洁明了,我们能够轻松地看出代码的主要逻辑和前置条件的检查过程。


完全摆脱 If-Else:策略模式的应用

如果你发现自己的 if-else 越来越多,尤其是在不断扩展的功能模块中,可以考虑使用设计模式中的策略模式(Strategy Pattern)来彻底摆脱 if-else

假设我们有不同的订单格式化方式,最初可能只有两种格式:JSON 和文本格式。简单的 if-else 代码可能长这样:

if (format.equals("JSON")) {return formatAsJson(order);
} else if (format.equals("TEXT")) {return formatAsText(order);
} else {return formatAsDefault(order);
}

随着时间推移,我们可能需要增加新的格式。如果继续用 if-else,将会违反“开放-关闭”原则,并且会让代码变得越来越难维护。这时,策略模式可以大显身手。

改进后的代码:
public interface OrderFormatter {String format(Order order);
}public class JsonFormatter implements OrderFormatter {@Overridepublic String format(Order order) {return formatAsJson(order);}
}public class TextFormatter implements OrderFormatter {@Overridepublic String format(Order order) {return formatAsText(order);}
}public class OrderFormatterFactory {private static final Map<String, OrderFormatter> formatters = new HashMap<>();static {formatters.put("JSON", new JsonFormatter());formatters.put("TEXT", new TextFormatter());}public static OrderFormatter getFormatter(String format) {return formatters.getOrDefault(format, new DefaultFormatter());}
}// 使用时
OrderFormatter formatter = OrderFormatterFactory.getFormatter(format);
return formatter.format(order);

通过这种设计,扩展新的格式化方式变得非常容易。我们只需添加新的 OrderFormatter 实现类,然后在 OrderFormatterFactory 中注册它,完全避免了修改已有代码。


结语

  • 去掉不必要的 Else 块:通过提前返回或抛出异常,减少嵌套,提升代码可读性。

  • 使用字典替代 If-Else:将条件逻辑映射到字典中,简化分支操作,并方便扩展。

  • 快速返回和保护子句:在前置条件不满足时,直接返回或退出,减少代码的嵌套复杂度。

  • 策略模式替代复杂的 If-Else:将不同分支逻辑封装成独立的策略类,通过工厂模式动态选择执行逻辑。

  • 遵循开闭原则:通过面向对象设计模式,避免直接修改现有逻辑,实现代码的灵活扩展。

if-else 虽然简单直接,但并不是解决逻辑问题的最佳选择。在大型项目中,过度依赖 if-else 会导致代码臃肿、难以维护。通过使用字典、策略模式以及前置条件检查等技巧,我们不仅可以摆脱冗长的分支逻辑,还能提升代码的可读性和可扩展性。

让你的代码更加优雅,从减少 if-else 开始!

相关文章:

Java 中消除 If-else 技巧总结

“过于依赖 if-else 不仅会让代码变得臃肿不堪&#xff0c;还会使维护成本大大增加。其实&#xff0c;if-else 虽然是最基础的条件分支&#xff0c;但它并不是万能的解决方案。简单粗暴的 if-else 很容易让代码可读性差、结构复杂。 今天&#xff0c;我将带大家了解一些取代 i…...

每个平台团队都应该跟踪的API指标

目录 识别关键 API 度量 基础架构/DevOps 应用工程/平台 产品管理 业务/增长 基础架构API指标 正常运行时间 CPU使用率 内存使用率 应用程序API指标 相应时间 平均和最大延迟 吞吐量 可用性 缓存命中率 每分钟错误数 每个业务事务的API调用 如何收集优化API指…...

Windows 11 24H2版本有哪些新功能_Windows 11 24H2十四大新功能介绍

距离上次发布的23H2版本已经过去了一年时间&#xff0c;现在&#xff0c;Win 11的24H2版本终于等到了&#xff0c;微软已经全面公开发布Win11 24H2版本&#xff0c;版本号为26100.1742&#xff0c;此次官宣的版本包括了消费者版、商业版、LTSC 2024版等&#xff0c;各种语言版本…...

渗透测试 之 AD域渗透 【Kerberoasting】 攻击技术讲解 对应得工具详细介绍哟~ 以及相关示例 按照步骤做你也会哟

说明 Kerberoasting 攻击发生在Kerberos协议的TGS_REP阶段&#xff0c;KDC的TGS服务返回一个由服务Hash加密的ST给客户端。由于该ST是用服务Hash进行加密的&#xff0c;因此客户端在拿到该ST后可以用于本地离线爆破。 攻击的过程 攻击者提供一个正常的域用户密码对域进行身份…...

如何在Ubuntu上更改MySQL数据存储路径

文章目录 0 背景1 备份现有数据库数据2 停止 MySQL 服务3 复制现有的 MySQL 数据到新目录4 修改 MySQL 配置文件5 更新 AppArmor 或 SELinux 配置&#xff08;如有启用&#xff09;6. 修改 MySQL 系统文件中的 datadir7. 启动 MySQL 服务8. 验证更改参考资料 0 背景 在原先划分…...

Cortex-M 内核的 OS 特性

目录 一、通用堆栈知识二、双堆栈用法三、PendSV 中断介绍和用法四、SVC 软中断介绍和用法五、特权级和非特权级使用方法 一、通用堆栈知识 在前面讲解 STM32 启动文件的时候就已经提到过&#xff0c;有关堆栈大小的设置是在启动文件中设置的&#xff1a; Heap 主要用于 Mal…...

第十六章 RabbitMQ延迟消息之延迟插件优化

目录 一、引言 二、优化方案 三、核心代码实现 3.1. 生产者代码 3.2. 消息处理器 3.3. 自定义多延迟消息封装类 3.4. 订单实体类 3.5. 消费者代码 四、运行效果 一、引言 上一章节我们提到&#xff0c;直接使用延迟插件&#xff0c;创建一个延迟指定时间的消息&…...

[单master节点k8s部署]32.ceph分布式存储(三)

基于ceph rbd生成pv 在集群中认证ceph 用下面代码生成ceph的secret .创建 ceph 的 secret&#xff0c;在 k8s 的控制节点操作&#xff1a; 回到 ceph 管理节点创建 pool 池&#xff1a; [rootmaster1-admin ~]# ceph osd pool create k8stest 56 pool k8stest created [rootm…...

git 相关问题解决一一记录

文章目录 gitssh.github.com: Permission denied (publickey)1. 检查 SSH 密钥生成新的 SSH 密钥添加 SSH 密钥到 GitHub 2. 配置 SSH 代理启动 SSH 代理添加私钥到 SSH 代理 3. 检查 SSH 配置文件4. 测试 SSH 连接5. 检查防火墙和网络设置6. 检查 GitHub 账户设置详细步骤 更新…...

UE4 材质学习笔记04(着色器性能优化)

一.着色器性能优化 1.衡量着色器的性能 衡量着色器性能的主要方法有三个 第一个&#xff1a;可以使用场景的视图模式的优化视图模式的着色器复杂度 下面的滑条代表了着色器指令的复杂度 如果场景大部分是绿色的&#xff0c;说明着色器耗能低&#xff0c;反之白色则是很糟糕…...

3、Redis Stack扩展功能

文章目录 一、了解Redis产品二、申请RedisCloud实例三、Redis Stack体验1、RedisStack有哪些扩展&#xff1f;2、Redis JSON1、Redis JSON是什么2、Redis JSON有什么用3、Redis JSON的优势 3、Search And Query1、传统Scan搜索2、Search And Query搜索 4、Bloom Filter1、布隆过…...

Flythings学习(二)控件相关

文章目录 1 前言2 通用属性2.1 控件ID值2.2 控件位置2.3 背景色2.4 背景图2.5 显示与隐藏2.6 控件状态2.7 蜂鸣器控制 3 文本类TextView4 按键类 Button4.1 系统按键4.2 处理按钮长按事件4.3 处理按键触摸事件 5 复选框CheckBox6 单选组 RadioGroup7 进度条&#xff0c;滑块7.1…...

关于multiprocessing使用freeze_support()方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、freeze_support()&#xff1f;二、使用方法总结 **注意下面** 如果有车载讨论需要的小伙伴&#xff0c;可以私信加我微信&#xff0c;拉你进群&#xff0c;…...

基于rk356x u-boot版本功能分析及编译相关(一)

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 uboot的分支是next-dev历史版本v2017-09uboot支持DM框架uboot前级pre-loader支持及引导下级uboot分区支持uboot支持固件格式secure bootuboot编译脚本位置build.shuboot/make.shrkbin仓库uboot的分支是next-dev历史版本v2017-…...

Jenkins---01

什么是敏捷开发 敏捷开发以用户的需求进化为核心&#xff0c;采用迭代、循序渐进的方法进行软件开发。在敏捷开 发中&#xff0c;软件项目在构建初期被切分成多个子项目&#xff0c;各个子项目的成果都经过测试&#xff0c;具备可视、 可集成和可运行使用的特征。换言之&…...

第十五届蓝桥杯C++B组省赛

文章目录 1.握手问题解题思路1&#xff08;组合数学&#xff09;解题思路2&#xff08;暴力枚举&#xff09; 2.小球反弹做题思路 3.好数算法思路&#xff08;暴力解法&#xff09;---不会超时 4.R格式算法思路 5.宝石组合算法思路---唯一分解定理 6.数字接龙算法思路----DFS 7…...

线程 vs 虚拟线程:深入理解及区别

Java 提供了两种线程机制&#xff1a;普通线程&#xff08;平台线程&#xff09;和 虚拟线程。普通线程是 Java 中经典的并发处理方式&#xff0c;而虚拟线程是随着 Java 21 引入的新特性&#xff0c;旨在提升并发性能和开发体验。本文将详细探讨它们的区别&#xff0c;并帮助你…...

【WEB应用安全测试指南–蓝队安全测试2】--超详细-可直接进行实战!!!亲测-可进行安全及渗透测试

安全基础理论入门知识参考上一篇《WEB应用安全测试指南蓝队安全测试1》 WEB应用安全测试指南2 一、文件 I/O 类1.1、任意文件上传1.2、任意文件下载1.3、文件包含 二、接口安全类2.1、短信炸弹2.2、邮件炸弹2.3、短信内容可控2.4、邮件内容可控 三、逻辑流程类3.1、越权3.2、未…...

使用HTML、CSS和JavaScript创建滚动弹幕效果

使用HTML、CSS和JavaScript创建滚动弹幕效果 在现代网页设计中&#xff0c;滚动文本是一种常见的动态效果&#xff0c;可以吸引用户的注意力并增强交互体验。在这篇博客文章中&#xff0c;我们将详细介绍如何使用HTML、CSS和JavaScript实现滚动文本效果。 效果 步骤1&#xf…...

【C语言】--数组

&#x1f60a;个人主页: 起名字真南 &#x1f60b;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 数组的概念2 一维数组的创建和初始化2.2 数组的初始化2.3 数组类型 3 一维数组的使用3.1 数组下标3.2 数组的输入 4 一维数组在内存中的存储5 sizeof计算数组中的元素6 二维…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...