理解非空和可空性注释

时间:2017-02-24 20:25:56

标签: java android design-patterns annotations design-by-contract

我不清楚我们如何正确使用关于可空的注释,即NonNull和Nullable 我对以下内容感到不舒服:

public void foo(@NonNull ArrayList<CustomObject> list) {  
   CustomObject o = list.get(0);  //etc
}  

1)防御性地声明非空代码是否无意义?
2)使用此类注释的最有效方法是什么?例如。作为一个例子       - 使用构建器模式或
时应如何使用它们 - 在为具体类定义接口时要实现?实现类的方法是否也包含注释或是否假设?
3)在上面的代码片段中是否有一种方法可以定义非空非空?

1 个答案:

答案 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
    }
}