Android @NNNNULL的用处

经过几次阅读和像这样的问题,我想知道是否有使用@NonNull Android支持注释点。

如果我尝试使用注解为@NonNullnull参数调用方法,我可以看到Android Studio的一个非常小的警告。 只是一个警告?

unit testing呢? 我应该用一个空的参数来testing这个方法吗? 如果我这样做…我会得到一个NullPointerException ,我的testing将失败

假设我们是两个开发者。 一个在API上工作,一个在各种方式下testingAPI。 作为第二个开发人员,我有责任testing所有的东西,以便API是防弹的。 这就是unit testing的重点,对吧?

那么…第一个使用@NonNull的开发人员有什么意义呢?

如果有其他人使用这个API的空参数…那么API会抛出一个NPE 。 然后他会想:“呃,那API太糟糕了!NPE! 他会是对的。 那个顽皮的开发者不检查他发送的参数是否为null,应该面临IllegalArgumentException,因为这是他的错,而不是API的!

我错了吗 ?

我认为这些注释会强制编译器显示错误,如attempting to call methodName(@NonNull Object object) with null parameter

更新1

好的,谢谢大家的意见。 如果可能的话,我想就此面临的“问题”进行总结。 抽象的方式。

我写了一些代码(一个API,一个库,一个类,不pipe)与私有的内部代码包装提供function的公共方法。

假设这些公共方法将被其他人(包括我)使用。 其中一些人的论点绝不能是空的 ,否则所有的地狱都会被打破。

阅读您的意见,我面临以下select:

  1. 继续使用Java Documentation支持的合同/注释( @NonNull ),规定parameter must not be null 。 不要检查空参数(否则IDE会警告我),不知何故,祈祷我永远不会收到一个空参数;
  2. 和上面一样,但强制执行一个空的检查(即使IDE会警告这个condition will always be false ),并抛出IllegalArgumentException而不是在我收到一个空参数的情况下导致一个NPE。
  3. 停止使用合同/注释,使用Java文档来警告其他开发人员并为所有参数添加手动检查。

最后,对于unit testing…我知道我不能拥有防弹代码,但我喜欢尽可能地“testing”我的代码,以防止我的代码出现意外的行为以及validation过程(这是在unit testing的基础上,我相信) –

它的主要目的是向你的同事提供信息。 一个人从来不是一个大型项目的唯一程序员。 使用NotNull告诉其他程序员,函数的合同意味着你永远不能发送null,所以他们不这样做。 否则,我可能会做一个逻辑假设,调用setFoo(null)将清除Foo,而API不能处理没有Foo。

我认为你的#2方法是为API /库做正确的方法。 使用注解进行静态分析以防止编译时尝试用null调用方法,并且在运行时使用空检查来给出一个有用的exception(并且在代码中快速失败/防止意外事件发生)如果null对象被传入。在空检查之前使用// noinspection ConstantConditions指令来告诉IDE禁止警告(因为您正在检查null是否有正当理由)。

随机的NPE表明库/ api作者可能遗漏了一些东西,并且在他们的代码中没有被处理的错误。

一个IllegalArgumentExceptionexception(或NPE,带有问题的描述 – 在这个实例中使用哪个exception是一个基于观点的参数)表明调用者在调用方法时犯了一个错误。

但最终,在你已经用@NonNull注释之后,是否要testingnull是基于观点和情况的。

评论可能为时已晚,但比从未更好

有一个Traute的 javac插件,它根据方法参数的注释插入空的检查到生成的字节码。

这是一个示例Android项目 。