Java11 如何优雅的非空校验
在Java编程中,经常需要对变量进行非空校验。Java11提供了一些新的特性和优雅的方式来进行非空校验,使代码更加简洁和易读。本文将介绍几种优雅的非空校验方法,并提供代码示例和清晰的逻辑。
1. 使用Objects.requireNonNull
Java11的Objects
类提供了一个静态方法requireNonNull
,用于检查给定的对象是否为空。如果为空,该方法会抛出NullPointerException
,并且可以通过添加自定义的错误信息来提供更多的上下文。
public void doSomething(String str) {
Objects.requireNonNull(str, "str must not be null");
// 执行具体的操作
}
上述代码中,如果str
为空,将抛出带有错误信息"str must not be null"的NullPointerException
。这种方式非常简洁,并且可以在一行代码中完成非空校验。
2. 使用Optional
Java8引入的Optional
类可以用来处理可能为空的值,并提供一些优雅的方法来进行非空校验。在Java11中,Optional
类得到了一些改进和扩展。
import java.util.Optional;
public void doSomething(Optional<String> optional) {
if (optional.isPresent()) {
String str = optional.get();
// 执行具体的操作
} else {
// 处理空值的情况
}
}
上述代码中,我们使用isPresent
方法来检查Optional
是否包含一个非空的值。如果存在值,我们可以通过get
方法来获取该值,并执行具体的操作。如果Optional
为空,我们可以在else
分支中处理空值的情况。
另外,在Java11中,我们还可以使用ifPresentOrElse
方法来处理Optional
是否为空的情况。
import java.util.Optional;
public void doSomething(Optional<String> optional) {
optional.ifPresentOrElse(str -> {
// 执行具体的操作
}, () -> {
// 处理空值的情况
});
}
ifPresentOrElse
方法接受两个参数,一个是处理非空值的Consumer
,另一个是处理空值的Runnable
。如果Optional
包含一个非空的值,将执行第一个参数,否则执行第二个参数。
3. 使用断言
在Java11中,我们可以使用断言来进行非空校验。断言是一种简洁而强大的方式,可以在运行时检查代码的逻辑。如果断言条件不满足,将抛出AssertionError
。
public void doSomething(String str) {
assert str != null : "str must not be null";
// 执行具体的操作
}
上述代码中,我们使用断言来检查str
是否为空。如果为空,将抛出带有错误信息"str must not be null"的AssertionError
。断言可以通过启用和禁用来控制是否执行。
4. 使用@NonNull注解
Java11引入了@NonNull
注解,可以用于标记方法参数和返回值不能为空。这样,在编译时,如果有代码试图传递或返回一个空值,编译器将会给出警告。
public void doSomething(@NonNull String str) {
// 执行具体的操作
}
上述代码中,我们使用@NonNull
注解来标记str
参数不能为空。如果有代码试图传递一个空值给str
,编译器将会给出警告。
总结
Java11提供了一些优雅的方式来进行非空校验。我们可以使用Objects.requireNonNull
来检查对象是否为空,使用Optional
来处理可能为空的值,使用断言来进行非空检查,以及使用@NonNull
注解来标记参数和返回值不能为空。这些方式都可以让我们的代码更加简洁和易读。
sequenceDiagram
participant A as 方法调用者
participant B as 方法接收者
A->>B: 调用方法
B-->>A: 抛出NullPointerException
A->>B: 调用方法
B->>B: 检查参数是否为空
B-->>A: 执行