你可能都不知道,JetBrains提供了这些好玩又实用的注解

2,497 阅读3分钟

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 飘警告黄线:

image.png

于是我们就可以提醒调用方法的其他人,调用前需要自行确认一下数据判断了。

@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";
}

编译器提醒:

image.png

@Contract 提醒方法纯函数

如某个方法是纯函数,没有任何副作用,且不修改实例内的任何属性,则可通过 @Contract(pure = true) 注解来提醒调用者。

纯函数指的是,对于相同的输入,总是返回相同的输出,且不会产生任何副作用。比如:

@Contract(pure = true)
public static String getHelloWorld(String hello, String world) {
    return hello + world;
}

@Contract 修改传入参数的后续不再为null

我们先来看这段场景:

image.png

如上图,我们写了个方法 assertNotNull() 方法来断言参数不能为空,否则抛出异常不再继续下面的业务代码,虽然空异常已经被抛出了,但后续的代码还是提醒了可能为空。

我们可以使用 @Contract("null -> fail") 注解来告诉编译器,传入的参数如果是空,则抛出失败异常,不会走后续的代码。如下:

@Contract("null -> fail")
public static void assertNotNull(Object object) {
    if (Objects.isNull(object)) {
        throw new NullPointerException("请不要传入空参数");
    }
}

@Constract 注解还提供了各种各样的表达式,可以参考该类的 JavaDoc 文档。

结语

JetBrains 的注解,提供了丰富的功能,能够帮助开发人员更好的编码,减少错误,提高代码质量。

希望你也:

image.png

今天的分享就到这。

Bye~