Java开发中与Null相关的注解都有哪些?

文章目录
-
- 1. @Nullable
- 2. @NonNull
- 3. @NotNull
- 4. @NullableDecl
- 5. @CheckForNull
- 6. @ParametersAreNonnullByDefault
- 7. @Contract
- 8.总结
在Java开发中,我们时常需要处理null的情况。为了增强代码健壮性和可读性,Java提供了许多与null相关的注解。本文将详细介绍这些注解。
1. @Nullable
@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。
2. @NonNull
与 @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,那么编译器会发出警告。
3. @NotNull
@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 异常。
4. @NullableDecl
@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。
5. @CheckForNull
@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。
6. @ParametersAreNonnullByDefault
该注解可以应用于包级别,表示该包中所有方法的参数都不能为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,那么编译器会发出警告。
7. @Contract
@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() 的前置条件和后置条件。
8.总结
在 Java 开发中,我们经常需要处理 null 的情况。Java 提供了许多与 null 相关的注解,如 @Nullable、 @NonNull、 @NotNull、 @NullableDecl、 @CheckForNull、 @ParametersAreNonnullByDefault、 @Contract 等等。这些注解可以帮助程序员提高代码的可读性和健壮性,减少 null 相关的错误。掌握这些注解的使用,对于 Java 开发工程师是至关重要的。


