为啥滥用 != null 是个坑
你还记得你第一次写 Java 代码吗?那时候,每次调用一个方法,你都会写上 if (something != null)。老实说,这习惯就跟小时候写作文一样,开头必写“一个风和日丽的早晨”,死板得很。滥用 != null,不光让代码看着冗长,还容易藏 BUG。想想你那几十行的 if-else 判空,谁能一眼看出问题?
Java 8 给咱们带来了个神器——Optional。啥意思呢?就是咱们可以用 Optional 来包装那些可能为 null 的对象,不再需要满世界写判空。
1.获取对象里面的字段
// 对象判断
public static void main1(String[] args) {
User user = new User();
user.setName("孙培洋");
String userName = Optional.of(user)
.map(User::getName)
.orElse("");
System.out.println(userName);
}
2.获取配置参数
我们再来看一个获取配置参数的例子。通常情况下,我们会从配置文件中读取参数,如果参数不存在,我们可能会返回 null,然后在调用处进行判空处理:
// 传统方法,返回 null 并判空
public String getConfig(String key) {
String value = configMap.get(key);
if (value != null) {
return value;
} else {
return null;
}
}
public void useConfig() {
String value = getConfig("someKey");
if (value != null) {
// 使用配置
} else {
// 使用默认值
}
}
改用 Optional:
import java.util.Optional;
public Optional<String> getConfig(String key) {
return Optional.ofNullable(configMap.get(key));
}
public void useConfig() {
String value = getConfig("someKey")
.orElse("defaultValue");
// 使用配置或默认值
}
3.少返回 null,多抛异常
有时候,咱们的确需要处理异常情况。很多初中级程序员喜欢返回 null 来表示异常情况。这其实是个坏习惯,应该多抛异常,少返回 null。为啥?因为 null 会让你的代码变得更脆弱,增加 NPE(NullPointerException)风险。
再举个栗子:
// 不推荐的返回 null 方式
public Person findPersonById(int id) {
if (id < 0) {
return null;
}
// 查找逻辑
}
// 调用时需要判空
Person person = findPersonById(-1);
if (person != null) {
// 处理 person
}
推荐的方式是抛异常:
// 推荐的抛异常方式
public Person findPersonById(int id) {
if (id < 0) {
throw new IllegalArgumentException("ID 不能小于 0");
}
// 查找逻辑
}
// 调用时处理异常
try {
Person person = findPersonById(-1);
// 处理 person
} catch (IllegalArgumentException e) {
// 处理异常
}
保护自己,别过度判空
// 滥用判空
if (obj != null && obj.getField() != null && obj.getField().getSubField() != null) {
// 逻辑处理
}
其实,你可以通过设计让代码更健壮,减少这些判空。例如使用工厂模式确保对象不为 null,或者用 Optional 链式调用。
// 使用 Optional
Optional.ofNullable(obj)
.map(Object::getField)
.map(Field::getSubField)
.ifPresent(subField -> {
// 逻辑处理
});