对于以下声明

public static <E extends SomeInterface> E methodName(
    @NonNull Supplier<@NonNull E> supplier,
    Consumer<@NonNull E> consumer)

Lombok是否自动对supplier s结果进行空判断? 和/或consumer确保传入的E是空判断的(例如,通过生成空包装器)是否有意义?

推荐答案

根据文件,@NonNull是纯粹的纪录片,除了2个 case :

  • 如果直接在参数上(而不是在参数内的一些泛型上),Lombok会判断您是否在方法开始的某个地方对该参数进行了显式的nullcheck.如果你不这样做,龙目岛就会增加一个.
  • 如果直接在一个字段上(而不是在一个字段类型内的一些泛型上),Lombok生成的任何构造函数、setter和派生函数都将为该值添加一个空判断.

That is it.例如,如果您将其粘贴在方法/返回类型上,Lombok不会生成任何判断.

这是故意的,任何试图改变这一行为的公关都将被拒绝.(来源:我是对这类事情做出最终决定的两个人之一).

为了具体解释为什么龙目鱼没有--事实上是cannot--对<>内的@NonNull做任何有意义的事情:

想象一下,你有一个方法,得了Iterable<String>分.

你希望龙目岛会怎么做?对参数调用.iterator(),循环到末尾(继续迭代,直到hasNext()返回false),并报告是否有任何.next()调用返回null?这一点:

  • 需要知道Iterable是如何工作的.Lombok无法对整个Java生态系统的全部知识进行编码.充其量,我们可以硬编码我们"知道"泛型对于众所周知的类型意味着什么,而只是放弃其他任何东西.然后,我想,写一些插件系统,这样你就可以判断你自己的东西了?这是一件艰巨而复杂的事情.到底是什么?

  • 在这里是行不通的--你可以制作无限的可迭代代码.龙目鱼会以一种不明显的方式编码一个无穷无尽的循环.显然是非常令人不快的行为.

  • 从数学上来说是不可能的.想象一下Supplier<@NonNull String>.我们是不是只需要打50次电话,判断一下null,然后在50次循环后就认为"足够好"了?IntFunction<@NonNull String>号怎么样?我们是否使用所有40亿个可能的int个值来调用它?那Function<String, @NonNull String>呢?如果这个功能不稳定怎么办?Function的文档不要求它是这样的--如果第一次使用某个值调用它时会产生与第二次不同的结果,该怎么办?

当您在该方法中调用lambdas时,Lombok最多只能添加空判断.但这实际上证明不了什么.如果将这个lambda传递给另一个方法会怎么样?对于"正常的"空性注释(直接在参数上),@NonNull保证它是正确的,并且该保证在传递变量时仍然有效.这在泛型中是不可能实现的.

Java相关问答推荐

PostgreSQL货币兑换率查询

Saxon 9:如何从Java扩展函数中的net.sf.saxon.expr. XPathContent中获取声明的变量

使用包私有构造函数强制子类Java类

Java WireMock定义存根在Cucumber并行执行的多线程测试中失败

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

将数组整体转换为链接表

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

CompleteableFuture是否运行在不同的内核上?

蒙蒂霍尔比赛结果不正确

为什么在maven中,getLast方法不适用于List?

使用While循环打印素数,无法正常工作

当构造函数创建一个新实例时,Java为什么需要&new";

如何用内置Java从JavaFX应用程序中生成.exe文件?

如何使用MapStrCut转换双向链接

为什么项目名称出现在我的GET请求中?

Kotlin-仅替换字符串中最后一个给定的字符串

为什么使用lo索引来解决二进制搜索问题不同于使用hi索引?

Cucumber java-maven-示例表-未定义一步

Maven创建带有特定类的Spring Boot jar和普通jar

java 11上出现DateTimeParseException,但java 8上没有