在 Java 中,null 和 Optional 都和“可能没有值”有关,但它们的设计目的、使用方式和安全性完全不同。
null 是什么null 是 Java 语言层面的一个特殊值,表示**“没有引用任何对象”**。
String s = null;
NullPointerExceptionString s = null;
int len = s.length(); // NullPointerException
Optional 是什么Optional<T> 是 Java 8 引入的一个容器类,用来明确表示“可能有值,也可能没值”。
Optional<String> opt = Optional.of("hello");
Optional<String> empty = Optional.empty();
Optional<String> opt = Optional.ofNullable(getValue());
String result = opt.orElse("default");
| 对比点 | null | Optional |
|---|---|---|
| 本质 | 语言值 | 容器对象 |
| 是否安全 | ❌ 易 NPE | ✅ 强制处理空值 |
| 语义 | 不明确 | 明确“可能无值” |
| 使用场景 | 任意引用类型 | 返回值(推荐) |
| 代码可读性 | 差 | 好 |
| 是否推荐滥用 | 不推荐 | 也不建议到处用 |
nullUser user = getUser();
if (user != null) {
System.out.println(user.getName());
}
OptionalOptional<User> user = getUser();
user.ifPresent(u -> System.out.println(u.getName()));
或使用默认值:
String name = getUser()
.map(User::getName)
.orElse("unknown");
Optional 的场景public Optional<User> findUserById(Long id)
Optional 的场景// 不推荐
class User {
Optional<String> email; // 没必要
}
null是“没有对象”,Optional是“明确告诉调用者:这里可能没值,请处理”。
最佳实践:
nullOptional 表达“可能无值”Optional 当万能替代品如果你愿意,我也可以讲 Optional 常见误用 或 和 Kotlin / Spring 的结合用法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。