断言(assert)是校验参数最简洁可控的方式,统一拦截null和非法状态:notnull校验对象、hastext校验字符串、notempty校验集合、istrue校验数值范围。

直接在工具类方法入口用断言(Assert)配合流程控制做校验,是最简洁、最可控的方式。不依赖调用方“自觉初始化”,也不靠编译器默认值侥幸过关。
用 Assert 工具统一拦截 null 和非法状态
把参数校验逻辑收束到一行断言调用中,既明确意图,又避免分散的 if 判断污染业务代码:
- 对象非空:`Assert.notNull(user, "用户对象不能为空")`
- 字符串非空非空白:`Assert.hasText(name, "用户名不可为空或仅含空白字符")`
- 集合非空:`Assert.notEmpty(orders, "订单列表不能为空")`
- 数值范围合法:`Assert.isTrue(age >= 0 && age
对可选参数做显式分支处理
当参数允许为 null,但后续逻辑需差异化执行时,用清晰的 if-else 结构替代模糊的“默认值兜底”:
- 不写 `timeoutMs = timeoutMs == null ? 3000 : timeoutMs;` 这类隐晦赋值
- 改写为:if (timeoutMs == null) { useDefaultTimeout(); } else { applyCustomTimeout(timeoutMs); }
- 让每条路径的行为可读、可测、可维护
避免在工具方法内静默初始化传入对象
传入的引用类型(如 List、Map)若为 null,不要在工具类里自动 new 一个返回——这会掩盖调用方的逻辑缺陷,也违背“工具类不改变输入语义”的原则:
- ❌ 错误示范:
if (items == null) items = new ArrayList(); - ✅ 正确做法:抛出明确异常,或提供两个重载方法 —— 一个要求非 null,一个接受 Supplier
- 延迟构造
结合 Optional 封装可空入参(Java 8+)
对语义上“可能不存在”的参数,主动用 Optional<t></t> 包装,把空值处理上升为类型契约:
- 方法签名改为:
public Result process(Optional<config> config)</config> - 内部用
config.orElseGet(DefaultConfig::new)或config.ifPresent(...)显式分支 - 调用方必须主动考虑“无配置”场景,无法绕过











