我不清楚我们如何正确使用关于可空的注释,即NonNull和Nullable 我对以下内容感到不舒服:
public void foo(@NonNull ArrayList<CustomObject> list) {
CustomObject o = list.get(0); //etc
}
1)防御性地声明非空和代码是否无意义?
2)使用此类注释的最有效方法是什么?例如。作为一个例子
- 使用构建器模式或
时应如何使用它们
- 在为具体类定义接口时要实现?实现类的方法是否也包含注释或是否假设?
3)在上面的代码片段中是否有一种方法可以定义非空和非空?
答案 0 :(得分:0)
现在我有适当的时间进行调查,这是我发现的。
1)
使用@NonNull
注释时,仍然可以进行防御性编码。仅仅因为参数具有@NonNull
注释,null
仍然可以在运行时传递。例如,使用如下数据类:
class DataClass {
@NonNull private String notNullString;
public DataClass() { notNullString = null; }
public String toString() { return notNullString; }
}
您将null
分配给@NonNull
变量的IDE will warn,但调用toString()
将返回null
}。要解决此问题以及询问why you're null-checking a @NonNull
variable的IDE警告,Google倾向于使用PreConditions.checkNotNull(T)
- 请参阅example code。
2)
正如评论中所提到的,我个人使用注释作为指导,null
是否是预期值。我无法在构建器模式中找到任何可用的实例,但您可以使用checkNotNull()
方法中的build()
强制执行此操作,以便任何意外的null
值扔一个NullPointerException
。
至于具体课程,它取决于你,但我个人会为了保持一致而添加它们。
3)
鉴于上述情况,我这样做:
public void foo(@NonNull ArrayList<CustomObject> list) {
checkNotNull(list, "List is null!");
if (!list.isEmpty()) {
CustomObject o = list.get(0); //etc
}
}