JetBrains 注解
JetBrains 提供了一些供 IDEA 用来优化编码过程中的一些提示和警告的注解,在编码的代码质量不够优雅的时候,这些注解往往能提供很多的帮助。
- 提醒方法调用方不允许传入
null,需要先自行处理判断 - 承诺返回值不可能为
null,调用方无需判空。 - 提醒调用方返回值可能为空,后续传入到其他非空方法时需要处理判空
- 标记方法是纯函数
- 提醒方法调用方传入的某个参数后续不再是
null
@NotNull 提醒调用方先处理null值
先看一段代码:
public static void main(String[] args) {
// getHello() 可能返回 null
String hello = getHello();
String world = "world";
System.out.println(getHelloWorld(hello, world));
}
public static String getHelloWorld(String hello, String world) {
return hello + world;
}
其中,
getHello()方法可能返回null,而getHelloWorld()我们是不期望用户传入任何null值的。
我们如何在编写 getHelloWorld() 方法时,告知编译器需要提醒调用方法的其他同学参数不能为 null 呢?
JetBrains 的 @NotNull 注解就是用来解决这个问题的。
我们在 getHelloWorld() 方法中添加 @NotNull 注解,如下:
public static String getHelloWorld(@NotNull String hello, @NotNull String world) {
return hello + world;
}
此时,编译器会给 getHelloWorld(hello, world) 的 hello 飘警告黄线:
于是我们就可以提醒调用方法的其他人,调用前需要自行确认一下数据判断了。
@Nullable 提醒调用方处理返回null值
如上面的 getHello() 方法可能返回 null,我们也可以为 getHello() 方法添加 @Nullable 返回值注解,如下:
public static @Nullable String getHello() {
if (Math.random() < 0.5) {
return null;
}
return "hello";
}
如果调用方调用了这个方法得到了一个可能为空的返回值,然后继续将返回值传入到其他标记了@NotNull 的方法中,编译器会提醒调用方返回的值可能是 null,需要自行处理判空。
@NotNull 提醒调用方无需处理null值
如下代码,我们可以为方法 getHello() 标记返回值的 @NotNull 注解,如果调用方后续还自行处理了类型,则编译器会提醒调用方没有这个必要判断,提醒删除这些没有意义的判断代码:
public static void main(String[] args) {
// getHello() 不返回 null
String hello = getHello();
if(Objects.isNull(hello)){
throw new NullPointerException("hello is null");
}
}
public static @NotNull String getHello() {
return "hello";
}
编译器提醒:
@Contract 提醒方法纯函数
如某个方法是纯函数,没有任何副作用,且不修改实例内的任何属性,则可通过 @Contract(pure = true) 注解来提醒调用者。
纯函数指的是,对于相同的输入,总是返回相同的输出,且不会产生任何副作用。比如:
@Contract(pure = true)
public static String getHelloWorld(String hello, String world) {
return hello + world;
}
@Contract 修改传入参数的后续不再为null
我们先来看这段场景:
如上图,我们写了个方法 assertNotNull() 方法来断言参数不能为空,否则抛出异常不再继续下面的业务代码,虽然空异常已经被抛出了,但后续的代码还是提醒了可能为空。
我们可以使用 @Contract("null -> fail") 注解来告诉编译器,传入的参数如果是空,则抛出失败异常,不会走后续的代码。如下:
@Contract("null -> fail")
public static void assertNotNull(Object object) {
if (Objects.isNull(object)) {
throw new NullPointerException("请不要传入空参数");
}
}
@Constract 注解还提供了各种各样的表达式,可以参考该类的 JavaDoc 文档。
结语
JetBrains 的注解,提供了丰富的功能,能够帮助开发人员更好的编码,减少错误,提高代码质量。
希望你也:
今天的分享就到这。
Bye~