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: 执行