对于以下声明
public static <E extends SomeInterface> E methodName(
@NonNull Supplier<@NonNull E> supplier,
Consumer<@NonNull E> consumer)
Lombok是否自动对supplier
s结果进行空判断?
和/或consumer
确保传入的E是空判断的(例如,通过生成空包装器)是否有意义?
对于以下声明
public static <E extends SomeInterface> E methodName(
@NonNull Supplier<@NonNull E> supplier,
Consumer<@NonNull E> consumer)
Lombok是否自动对supplier
s结果进行空判断?
和/或consumer
确保传入的E是空判断的(例如,通过生成空包装器)是否有意义?
根据文件,@NonNull
是纯粹的纪录片,除了2个 case :
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
保证它是正确的,并且该保证在传递变量时仍然有效.这在泛型中是不可能实现的.