Java 8中@NonNull注解的使用及List元素非空约束方法
Java 8中@NonNull注解的使用详解
嘿,这个问题问得相当精准!很多开发者刚接触@NonNull时都会混淆这两种场景,我来给你理得明明白白。
一、@NonNull注解的基础定义用法
首先得说明:Java 8本身并没有内置官方的@NonNull注解,我们常用的是第三方库提供的(比如JSR 305的javax.annotation.Nonnull、Spring的org.springframework.lang.NonNull),但它们的核心用法逻辑完全一致,主要用于标记不允许为null的元素,常见使用场景有这三类:
类字段上标记:明确类的成员变量不能为null,通常配合构造器或setter方法,避免实例化后出现null字段
public class User { @NonNull private String nickname; public User(@NonNull String nickname) { this.nickname = nickname; } }方法参数上标记:强制方法的调用者必须传入非null的参数,避免方法内部因null引发异常
public void sendMessage(@NonNull String content) { // 这里可以放心调用content的方法,无需额外null检查 System.out.println("发送消息:" + content.trim()); }方法返回值上标记:向调用方承诺方法返回的结果绝不会是null,调用方可以直接使用返回值
@NonNull public String getSystemDefaultName() { return "system_user"; }
二、如何声明元素均为非空String的列表?
你提到的@NonNull List<String>其实只完成了一半:它保证列表对象本身不会是null,但列表里的元素依然可能存在null值。如果要强制列表中的每个String元素都非空,我们需要把@NonNull注解放到泛型参数的位置,也就是:
// 同时保证列表对象非空 + 列表内所有String元素非空 public void processNonEmptyStrings(@NonNull List<@NonNull String> stringList) { for (String str : stringList) { // 这里完全不用怕str为null,可以安全调用任何String方法 System.out.println(str.toUpperCase()); } }
划重点:
@NonNull List<String>→ 列表对象不能为null,元素可以是nullList<@NonNull String>→ 列表对象可以为null,但元素必须全是非空String@NonNull List<@NonNull String>→ 列表对象和内部元素都不允许为null
另外要注意:这种在泛型参数中使用@NonNull的方式,要求你的@NonNull注解支持TYPE_USE这个目标(Java 8新增的注解目标类型),绝大多数主流第三方库的@NonNull注解都已经支持这一点了,放心用就行。
内容的提问来源于stack exchange,提问作者Niraj Sonawane
相关产品推荐
相关产品推荐

