2015-08-15 126 views
7

我对这些注释的正确使用感到困惑。@NonNull和@Nullable的正确用法是什么?

android.support.annotation.NonNull; 
android.support.annotation.Nullable; 

@NonNull文档中的信息说:

表示一个参数,字段或方法的返回值不能为空。

这是什么意思在参数的情况下,当没有什么可以阻止你通过null

例如,假设我有一个类MyObject和一个实例可以或可以不具有一个标题。

public final class MyObject { 

    private String title = null; 

    public void setTitle(String title) { 
     if (title == null) 
      throw new NullPointerException(); 
     this.title = title; 
    } 

    public void clearTitle() { 
     title = null; 
    } 
} 

这里我使用null表示没有标题的,但是这是一个实现细节,所以我不想对设置和清除标题一个方法。

如果我标志着该领域title@Nullable,机器人工作室告诉我,参数setTitle也许应该被标记@Nullable太(但这是我想的正好相反)。

如果我标志着参数为setTitle方法@NonNull我得到的警告条件title == null总是false

在这种情况下,这些注释的正确用法是什么?如果@NonNull意味着一个参数可以永远null是错用它来指应该null?如果是,是否有正确的方法来表明这一点?

回答

1

的一点是,这个注释是某种形式的合同,所以你并不需要,如果你正确地annoate你的方法进行检查。 Android Studio会检查你是否不喜欢它。您仍然可以忽略它,但这会导致编译器警告。

如果省略无用的(合同)的安全检查,将正确抛出NullPointerException异常。但是开发者被你的注解警告了。

+0

一般来说,检查仍然是必需的。注释有助于IDE了解合同。一些IDE进一步发展并产生运行时错误,虽然IDE的这种运行时检查是礼节性的,而不是要求。 –

0

@Nonnull@Nullable是声明。这是同行软件开发人员的一个暗示。你告诉他们,一个参数可以是一个空值,或者它不能。

如果标记与@Nonnull标注的参数,你告诉使用API​​的每个人,他们不应该在这里传递null值,否则他们不得不面对的后果(例如NullPointerException)。

你可以用它来声明,该参数不应为空,这是一个有效的使用情况,在我看来。

0

来吧,标志着参数为setTitle方法@NonNull

当某些代码调用setTitle的值为可能为空时,这将确保编译器发出错误。所以编译器确保setTitle从来没有null调用。因此,您可以删除方法中的null检查,使'title == null始终为false'警告消失。

I.e.你的代码看起来就像这样:

public final class MyObject { 

    private String title = null; 

    public void setTitle(@NonNull String title) { 
     this.title = title; 
    } 

    public void clearTitle() { 
     title = null; 
    } 
} 

(注:我没有使用过Android Studio,但我想它的行为类似于Eclipse在Eclipse中我得到一个错误Null type mismatch: required '@NonNull String' but the provided value is null(/inferred as @Nullable)试图通过空或表达式可以为空时。到的setTitle)

BTW:还标注场title的定义与@Nullable将使它更加明确title也可以包含null值。

0

如果您将参数标记为@NonNull,那么您的方法的用户需要执行空检查,因为@NonNull在运行时不会捕获NPE。因此,举例来说,如果您有一个带有帮助器方法的实用程序类,它在执行之前检查null,那么您会将这些参数标记为@Nullable,因为您在技术上可以传递空值,但是正在安全地检查它。

相关问题