java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java优雅判空方法

Java优雅实现判空方法(结合实际案例)

作者:清风拂山感

相信写过代码的朋友们都会进行一个非空判断,但是各种非空判断中,那种才是最优雅,最高效的呢,这篇文章主要介绍了Java优雅实现判空方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在 Java 开发中,频繁的 if (obj != null) 判空代码会导致代码冗余、可读性差,且容易遗漏判空导致 NullPointerException。以下从 语言特性、设计模式、工具类 和 编码规范 四个维度,结合实际案例,详解如何优雅处理空值问题。

一、利用 Java 8+ 的 Optional 类

Optional 是函数式编程的容器类,显式表达可能为空的值,强制开发者处理空逻辑。

1. 案例:链式处理嵌套对象

传统判空代码(易出错且冗长):

public String getUserCity(User user) {
    if (user != null) {
        Address address = user.getAddress();
        if (address != null) {
            return address.getCity();
        }
    }
    return "Unknown";
}

使用 Optional 优化:

public String getUserCity(User user) {
    return Optional.ofNullable(user)
        .map(User::getAddress)     // 若user为null,直接跳过
        .map(Address::getCity)     // 若address为null,跳过
        .orElse("Unknown");        // 最终兜底值
}

2. 关键方法

3. 注意事项

二、工具类封装判空逻辑

通过工具类集中处理空值,减少重复代码。

1. 使用 Objects 类(Java 7+)

import java.util.Objects;

// 参数校验(若input为null,抛出NPE)
public void process(String input) {
    Objects.requireNonNull(input, "Input must not be null");
    // 后续逻辑
}

2. Apache Commons Lang3

import org.apache.commons.lang3.StringUtils;

// 判空并处理字符串
if (StringUtils.isNotBlank(str)) {
    System.out.println(str.trim());
}

// 通用对象判空
if (ObjectUtils.isNotEmpty(list)) {
    list.forEach(System.out::println);
}

3. Guava 的 Preconditions

import com.google.common.base.Preconditions;

public void process(String input) {
    Preconditions.checkArgument(input != null, "Input must not be null");
    // 后续逻辑
}

三、通过设计模式规避空指针

1. Null Object 模式

场景:需要避免返回 null 的业务逻辑。

案例:订单系统中的客户信息查询:

public interface Customer {
    String getName();
    boolean isAnonymous();
}

// 真实客户对象
public class RealCustomer implements Customer {
    private String name;
    public String getName() { return name; }
    public boolean isAnonymous() { return false; }
}

// 空对象(代替null)
public class NullCustomer implements Customer {
    public String getName() { return "Anonymous User"; }
    public boolean isAnonymous() { return true; }
}

// 使用
public Customer findCustomerById(String id) {
    Customer customer = db.query(id);
    return customer != null ? customer : new NullCustomer();
}

// 客户端无需判空
customer.getName(); // 永远有值

2. 返回空集合而非 null

错误示例:

public List<String> getOrders() {
    if (noOrders) {
        return null;  // 导致客户端必须判空
    }
    return orders;
}

正确实践:

public List<String> getOrders() {
    return orders != null ? orders : Collections.emptyList();
}

// Java 9+ 可使用 List.of()
public List<String> getOrders() {
    return orders != null ? orders : List.of();
}

四、静态代码分析与注解

通过 @Nullable 和 @NonNull 注解,结合 IDE 或静态分析工具(如 Checker Framework、SpotBugs)在编译时检查空值。

1. 使用 Spring 的注解

import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

public void process(@NonNull String input) { // 标记参数不可为null
    System.out.println(input.length());
}

@Nullable
public String findNameById(Long id) { // 明确返回值可能为null
    return nameService.query(id);
}

2. 集成 IDE 检查

五、Lombok 的 @NonNull

自动生成判空代码,适合简化方法参数校验。

import lombok.NonNull;

public void process(@NonNull String input) { 
    // Lombok 自动生成:if (input == null) throw NPE
    System.out.println(input.length());
}

六、综合案例分析

场景:订单服务中获取用户地址

传统代码:

public String getOrderAddress(Order order) {
    if (order != null) {
        User user = order.getUser();
        if (user != null) {
            Address address = user.getAddress();
            if (address != null) {
                return address.getFullAddress();
            }
        }
    }
    return "Address not found";
}

优化方案:

public String getOrderAddress(Order order) {
    return Optional.ofNullable(order)
        .map(Order::getUser)
        .map(User::getAddress)
        .map(Address::getFullAddress)
        .orElse("Address not found");
}

进一步优化(结合设计模式):

/ 定义 NullAddress 对象
public class NullAddress implements Address {
    public String getFullAddress() {
        return "Address not found";
    }
}

// 修改 User 类的 getAddress 方法
public Address getAddress() {
    return address != null ? address : new NullAddress();
}

// 最终代码
public String getOrderAddress(Order order) {
    return Optional.ofNullable(order)
        .map(Order::getUser)
        .map(User::getAddress)
        .map(Address::getFullAddress)
        .orElse("Address not found"); // 或直接返回空对象的逻辑
}

总结:何时使用哪种方案?

终极原则:

通过以上方法,可显著减少 if (obj != null) 的显式判空,提升代码的安全性和可维护性。

到此这篇关于Java优雅实现判空方法的文章就介绍到这了,更多相关Java优雅判空方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文