@Nullable
表示该程序元素可以为null。例如,当一个方法返回类型为 @Nullable
时,表示该方法可能会返回null。在使用该注解时,编译器会发出警告,提醒程序员在使用该程序元素时需要注意null的情况。
示例代码:
public class Person {
private @Nullable String name;
public @Nullable String getName() {
return name;
}
public void setName(@Nullable String name) {
this.name = name;
}
}
在上面的示例代码中,使用了 @Nullable
注解来表示 name
属性和 getName()
、 setName()
方法可以为null。
与 @Nullable
不同, @NonNull
表示该程序元素不可能为null。使用该注解可以帮助程序员减少null相关的错误,提高代码的可读性。
示例代码:
public class Person {
private @NonNull String name;
public @NonNull String getName() {
return name;
}
public void setName(@NonNull String name) {
this.name = name;
}
}
在上面的示例代码中,使用了 @NonNull
注解来表示 name
属性和 getName()
、 setName()
方法不可能为null。如果程序员在使用这些程序元素时传入了null,那么编译器会发出警告。
@NotNull
和 @NonNull
类似,也表示该程序元素不可能为null。但其语义更加强烈,是由JetBrains提供的注解。其中的关键是JDK的Objects.requireNonNull
方法,会在某段错误中,抛出一个NullPointerException
异常。如果某个参数是null,该注解会导致检测到该异常。在That形式的代码中,定义了一个名为jetbrains.annotations.NotNull的注释。通过将自定义注释添加到它们的API中,JetBrains支持尽早公开不可达状况,增强了客户端代码的可读性和可枚举性,并允许扩展这些警告。@NotNull只能用于方法参数,而不是要注释为method*er的任何thing,因为非null保证几乎不能由Reflect API和ModLoader充分利用。
示例代码:
public class Person {
private @NotNull String name;
public @NotNull String getName() {
return name;
}
public void setName(@NotNull String name) {
this.name = name;
}
}
如果程序员在使用 name
属性和 getName()
、 setName()
方法时传入了null,那么编译器会发出警告,并抛出 NullPointerException
异常。
@NullableDecl
注解相当于在 @Nullable
和 @CheckForNull
之间做了个桥梁,表示在这个程序元素上最好是使用 @Nullable
,但如果决定使用 @CheckForNull
,也可以。
示例代码:
public class Person {
private @NullableDecl String name;
public @NullableDecl String getName() {
return name;
}
public void setName(@NullableDecl String name) {
this.name = name;
}
}
在上面的示例代码中,使用了 @NullableDecl
注解来表示程序元素可以为null,但最好使用 @Nullable
。
@CheckForNull
注解表示在这个程序元素上,应该注意它不应该为null。该注解通常用于public方法和构造函数上。
示例代码:
public class Person {
private @CheckForNull String name;
public @CheckForNull String getName() {
return name;
}
public void setName(@CheckForNull String name) {
this.name = name;
}
}
在上面的示例代码中,使用了 @CheckForNull
注解来表示程序元素可以为null,但需要注意它不应该为null。
该注解可以应用于包级别,表示该包中所有方法的参数都不能为null。如果某个方法允许参数为null,则可以在方法上添加 @Nullable
注解来覆盖该默认规则。
示例代码:
@ParametersAreNonnullByDefault
public class Person {
private String name;
public String getName(@Nonnull String prefix) {
return prefix + name;
}
public void setName(String name) {
this.name = name;
}
}
在上面的示例代码中,使用了 @ParametersAreNonnullByDefault
注解,表示 getName()
方法的参数不能为null。如果程序员传入了null,那么编译器会发出警告。
@Contract
注解用于指示方法契约,可以使静态分析工具更好地理解方法。该注解定义了一个具有前置条件和后置条件的方法。例如,我们可能会定义一个 @Contract
注解来表示在 List
的 add()
方法中,调用前的集合大小等于操作后的集合大小。
示例代码:
public class Person {
private final List<String> list = new ArrayList<>();
@Contract("_ -> _")
public boolean add(String s) {
return list.add(s);
}
}
在上面的示例代码中,使用了 @Contract
注解来定义方法 add()
的前置条件和后置条件。
在 Java 开发中,我们经常需要处理 null 的情况。Java 提供了许多与 null 相关的注解,如 @Nullable
、 @NonNull
、 @NotNull
、 @NullableDecl
、 @CheckForNull
、 @ParametersAreNonnullByDefault
、 @Contract
等等。这些注解可以帮助程序员提高代码的可读性和健壮性,减少 null 相关的错误。掌握这些注解的使用,对于 Java 开发工程师是至关重要的。