选of()还是ofNullable()取决于参数是否确定不为null:确定非空用of()(如字面量、new对象、已判空变量),否则必须用ofNullable()(如DB查询、HTTP响应等可能为null场景)。

选 of() 还是 ofNullable(),关键看参数值是否“确定不为 null”——不是看你想不想让它安全,而是看它在当前上下文里有没有可能为 null。
明确非空时用 of()
当你能 100% 确保传入的值一定有值,比如字面量、刚 new 出的对象、已做过判空的变量,就用 of()。它不校验 null,但一旦传了 null 就立刻抛 NullPointerException,帮你快速暴露逻辑错误。
-
Optional.of("hello")✅ 安全,字符串字面量不可能为 null -
Optional.of(new User())✅ 刚实例化的对象不会为 null -
if (user != null) { Optional.of(user); }✅ 前置判断已保证非空
可能为空时必须用 ofNullable()
绝大多数业务场景都属于这一类:数据库查询结果、HTTP 接口返回、Map.get()、用户输入、配置读取等——这些值天然就可能为 null。此时必须用 ofNullable(),它会把 null 转成 Optional.empty(),后续可用 isPresent()、orElse() 等安全处理。
-
User user = userDao.findById(123); Optional.ofNullable(user)✅ 正确,id 不存在时返回 null 是正常行为 -
String name = request.getParameter("name"); Optional.ofNullable(name)✅ 请求参数可能为空 -
Optional.of(map.get("key"))❌ 危险!map.get 可能返回 null,会直接崩溃
别把 of() 当“默认包装”用
有些开发者习惯性写 Optional.of(obj),以为只是加个壳,其实是在埋雷。Java 的设计意图很清晰:of() 是断言(assertion),表示“我担保这个值非空”;ofNullable() 才是适配现实世界的容错入口。误用 of() 不仅引发运行时异常,还掩盖了本该显式处理的空值逻辑。
立即学习“Java免费学习笔记(深入)”;
- 它不替代判空,而是要求你提前确认或转换好语义
- 如果不确定,就别猜——统一用
ofNullable()更稳妥 - 团队代码规范中建议:除非有明确注释说明非空依据,否则默认使用
ofNullable()
源码层面的差异很直白
翻一下 JDK 源码就能看清本质:
-
of(T value)内部调用Objects.requireNonNull(value),null 就炸 -
ofNullable(T value)实际就是:value == null ? empty() : of(value)
所以它俩不是“风格不同”,而是契约不同:一个要求你负责,一个替你兜底。


















