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
相关产品推荐
相关产品推荐

