【发布时间】:2017-02-24 20:25:56
【问题描述】:
我不清楚我们如何正确使用有关可为空的注释,即 NonNull 和 Nullable。
我对以下内容不太满意:
public void foo(@NonNull ArrayList<CustomObject> list) {
CustomObject o = list.get(0); //etc
}
1) 防御性地声明非空和代码是没有意义的吗?
2)使用此类注释的最有效方法是什么?例如。举个例子
- 使用构建器模式时应该如何使用它们或
- 定义具体类的接口来实现时?实现类的方法应该也包含注解还是假定它?
3)在上面的sn-p中有没有办法定义非空和非空?
【问题讨论】:
-
当我知道一个变量保证不为空时,我通常使用
@NonNull。据我所知,它对编译后的代码没有影响,但会抑制 IDE 中的所有“可能是null”警告。相反,我使用@Nullable,在某些情况下我希望一个变量为空。 -
@MichaelDodd:在审查代码时,这不是为了您自己的自我记录目的吗? other 开发人员将使用/访问的方法怎么样?实用方法或方法是模块或库的一部分?
-
我认为文档和可读性是
android-annotations的全部目的。在我的工作团队中,我们广泛使用这些注释来阐明变量可能/不应该是null。同样,如果库方法 a 被这样注释,它会成为关于是否需要null检查的建议。 -
@MichaelDodd:是的,预期的行为是什么?声明一个永远不应为 null 的变量,然后在不检查 null 的情况下访问它?或者检查 null 并抛出一个显式的 NPE?还是检查 null 并停止处理并返回一些错误值?
-
这一切都取决于您的环境。事实上,Kotlin's support of
@NonNull允许在尝试使用null时发生编译时错误。在某些环境中,@NonNull可能会教授防御性编码风格。
标签: java android design-patterns annotations design-by-contract