Android @NonNull有用

时间:2016-02-24 14:23:24

标签: java android unit-testing android-studio annotations

经过一些阅读和问题like this one后,我想知道使用@NonNull Android支持注释是否有意义。

如果我尝试使用注释为 @NonNull null 参数调用方法,我可以看到来自Android Studio的非常小的警告。只是警告??

单元测试怎么样? 我应该使用空参数测试方法吗?如果我这样做...我将获得NullPointerException,我的测试将失败

我们说我们是两位开发人员。一个在API上工作,另一个在各种方式下测试API。 作为第二个开发人员,我有责任测试所有内容,以便API具有防弹功能。这是单元测试的重点,对吧?

那么......第一个开发人员使用@NonNull是什么意思?

如果其他人将此API与null参数一起使用......那么API会抛出 NPE 。然后他会想:" Urg,那个API糟透了...... NPE!"他会是对的。那个顽皮的开发人员没有检查他发送的参数是否为null应该面对 IllegalArgumentException ,因为他的错不是API的错误!

我错了吗?

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

更新1

好的,谢谢大家的意见。如果可能的话,我想总结一下"问题"我面对的是这里。以抽象的方式。

我使用提供功能的公共方法包装的私有内部代码编写一些代码(API,库,类,等等)。

假设其他人(包括我)将使用这些公共方法。 其中一些人认为绝对不能 null 的论据,否则一切都会破裂。

阅读您的评论,我面临以下选择:

  1. 继续使用规定@NonNull的Java文档支持的合同/注释(parameter must not be null)。不要检查空参数(否则IDE会警告我),不知何故,祈祷我永远不会收到空参数;
  2. 与上述相同,但强制执行空检查(即使IDE会警告condition will always be false)并抛出IllegalArgumentException而不是在收到空参数时导致NPE;
  3. 停止使用合同/注释,使用Java Doc警告其他开发者并添加所有参数的手动检查。
  4. 最后,对于单元测试...我知道我不能使用防弹代码,但我喜欢" monkey-test"我的代码尽可能地防止我的代码出现意外行为以及验证过程(我认为这是单元测试的基础) -

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:0)

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

随机NPE表示库/ api作者可能遗漏了某些内容并且有一个未在其代码中处理的错误。

IllegalArgumentException(或带有问题描述的NPE - 在此实例中使用的异常是基于意见的参数)表示调用者在调用方法时出错。

最终,在你已经使用@NonNull注释后是否测试null将是基于意见和依赖于情境的。

答案 2 :(得分:0)

评论可能为时已晚,但要比以后更好:)

有一个Traute javac 插件,它根据方法参数的注释将 null -checks插入到生成的字节码中。

这是sample Android project,说明了这一点。