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 开发工程师是至关重要的。