You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lombok @NonNull对Supplier返回值及Consumer参数的空检查作用咨询

Lombok @NonNull 与函数式接口的生效逻辑

1. @NonNull 对 Supplier 对象本身的生效情况

Lombok的@NonNull注解标注在Supplier参数上时,仅会检查这个Supplier对象本身是否为null,不会自动处理它的返回值。比如你代码里的@NonNull Supplier<@NonNull E> supplier,Lombok生成的代码会先判断supplier == null,如果为true则抛出NullPointerException,但不会校验supplier.get()返回的E是否为null。

2. Supplier返回结果的自动空检查问题

你在泛型参数中添加的@NonNull E(即Supplier<@NonNull E>),这个注解不会触发Lombok生成返回值的空检查逻辑。Lombok的@NonNull核心作用是处理方法参数、字段的空校验,泛型上的@NonNull更多是给静态代码分析工具(如IDEA代码检查器、SpotBugs)提供提示,Lombok本身不会基于此生成运行时的空判断代码。

如果需要校验supplier.get()的返回值,得手动实现:

E result = supplier.get();
if (result == null) {
    throw new NullPointerException("supplier returned null");
}

3. 为Consumer确保传入E非空的合理性

从运行时安全角度看,为Consumer<@NonNull E>添加空检查包装器是合理的,但Lombok本身不会自动完成这件事。因为Consumer的accept方法调用逻辑由调用方控制,Lombok无法自动拦截并注入空校验逻辑。

如果要确保传入Consumer的E不为null,有两种可行方案:

  • 在调用consumer.accept(e)前,手动检查e是否为null,非空再传入;
  • 手动封装安全的Consumer包装类:
public static <T> Consumer<T> safeConsumer(Consumer<T> consumer) {
    return t -> {
        if (t == null) {
            throw new NullPointerException("Cannot pass null to consumer");
        }
        consumer.accept(t);
    };
}

之后在方法内用这个包装类处理传入的consumer:consumer = safeConsumer(consumer);


内容的提问来源于stack exchange,提问作者serv-inc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:23:15