工具类处理未初始化参数的核心原则是“守门”而非“兜底”:所有public方法首行校验参数,用assert.notnull等明确报错;区分必填与可选参数,可选者用@nullable标注并安全取默认值;返回可能为空结果时用optional封装;依赖外部状态的需静态检查或首次调用时fail-fast。

工具类中处理未初始化参数的核心原则是:不替调用方做决定,但要清晰拦截、明确反馈、提供安全出口。重点不是“兜底”,而是“守门”和“引导”。
明确校验入口参数
所有 public 工具方法都应把参数校验作为第一道逻辑。使用 Spring 的 Assert.notNull() 或 Apache Commons Lang 的 Validate.notNull() 是最简洁的方式:
-
Assert.notNull(input, "input 不能为空") —— 抛出
IllegalArgumentException,语义清晰,堆栈干净; - 避免手动写
if (input == null) throw new IllegalArgumentException(...),冗余且易漏错误信息; - 对字符串额外加 Assert.hasText(),对集合用 Assert.notEmpty(),覆盖常见空值形态。
区分“可选参数”与“必填参数”
不是所有参数都要强校验。若某参数天然支持跳过(如配置项、回调函数),应显式设计为可空,并在文档/注释中标明语义:
- 用 @Nullable 注解标注形参,配合 IDE 和静态分析工具提前预警;
- 方法内部用 Objects.requireNonNullElse(input, defaultValue) 安全取默认值,而非直接判空后 new;
- 避免在工具方法里默默把 null 转成空集合或空字符串——这会掩盖调用方的意图错误。
用 Optional 封装可能为空的返回值
当工具方法本身需要返回一个可能不存在的结果(比如查找、解析、转换),不要返回 null,改用 Optional
- 调用方能通过
isPresent()、orElse()、ifPresent()显式处理分支,语义自解释; - 禁止在工具类中写
return Optional.ofNullable(someObject)包裹一个本不该为 null 的对象——那是设计缺陷,不是补救; - 若兼容老代码,可提供两个重载方法:一个返回
Optional,一个带defaultValue参数的便捷版。
静态初始化检查 + Fail-fast
对于依赖外部状态(如配置、单例资源)的工具类,应在类加载或首次调用时验证关键依赖是否就绪:
- 在 static 块中检查必要字段是否非 null,失败则抛
IllegalStateException; - 或在首个 public 方法开头调用私有
ensureInitialized(),统一报错提示“请先调用 Xxx.init()”; - 不建议静默初始化(如自动 new 实例),因为隐藏了初始化时机和依赖关系,不利于测试和容器管理。











