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 注解来表示在 Listadd() 方法中,调用前的集合大小等于操作后的集合大小。

示例代码:

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

你可能感兴趣的:(java)