@NonNull

这个注解可以用在成员方法、构造方法的参数前面或者用在成员变量上方,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常。

//成员方法参数加上@NonNull注解
public String getName(@NonNull Person p){
    return p.getName();
}

///// 相当于   ///////

public String getName(@NonNull Person p){
    if(p==null){
        throw new NullPointerException("person");
    }
    return p.getName();
}

@Getter/@Setter

这一对注解从名字上就很好理解,用在成员变量前面,相当于为成员变量生成对应的get和set方法,同时还可以为生成的方法指定访问修饰符,当然,默认为public。
这两个注解还可以直接用在类上,可以为此类里的所有非静态成员变量生成对应的get和set方法。

@ToString

就是生成toString方法

@EqualsAndHashCode

生产Equals方法和hashCode方法。

@NoArgsConstructor/@RequiredArgsConstructor /@AllArgsConstructor

这三个注解都是用在类上的。
第一个和第三个都很好理解,就是为该类产生无参的构造方法和包含所有参数的构造方法,第二个注解则使用类中所有带有@NonNull注解的或者带有final修饰的成员变量生成对应的构造方法,当然,和前面几个注解一样,成员变量都是非静态的,另外,如果类中含有final修饰的成员变量,是无法使用@NoArgsConstructor注解的。
三个注解都可以指定生成的构造方法的访问权限,同时,第二个注解还可以用@RequiredArgsConstructor(staticName=”methodName”)的形式生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象。

这里注意一个 Java 的小坑,当我们没有指定构造器时,Java 编译器会帮我们自动生成一个没有任何参数的构造器给该类,但是如果我们自己写了构造器之后,Java 就不会自动帮我们补上那个无参数的构造器了。然而很多地方(像是 Spring Data JPA),会需要每个类都一定要有一个无参数的构造器,所以你在加上 @AllArgsConstructor 时,一定要补上 @NoArgsConstrcutor,不然会有各种坑等着你

@RequiredArgsConstructor(staticName = "myConstructor")
@AllArgsConstructor
@NoArgsConstructor
public class Shape {
    private int x;
    @NonNull
    private double y;
    @NonNull
    private String name;
}

////// 相当于 //////////

public class Shape {
    private int x;
    private double y;
    private String name;

    public Shape(){
    }

    protected Shape(int x,double y,String name){
        this.x = x;
        this.y = y;
        this.name = name;
    }

    public Shape(double y,String name){
        this.y = y;
        this.name = name;
    }

    public static Shape myConstructor(double y,String name){
        return new Shape(y,name);
    }
}

@Data/@Value

@Data 相当于 @Getter/@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor。
其中@RequiredArgsConstructor使用了类中的带有@NonNull注解的或者final修饰的成员变量,它可以使用@Data(staticConstructor=”methodName”)来生成一个静态方法,返回一个调用相应的构造方法产生的对象。

@Value注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。

@Builder

自动生成流式 set 值写法,从此之后再也不用写一堆 setter 了。
注意,虽然只要加上 @Builder 注解,我们就能够用流式写法快速设定对象的值,但是 setter 还是必须要写不能省略的,因为 Spring 或是其他框架有很多地方都会用到对象的 getter/setter 对他们取值/赋值。
所以通常是 @Data 和 @Builder 会一起用在同个类上,既方便我们流式写代码,也方便框架做事。

@Builder
public class User {
    private Integer id;
    private String name;
}

//////  使用 //////

public static void main() {
    User user = User.builder().id(1).name("John").build();
}

@Slf4j等日志注解

自动生成该类的 log 静态常量,要打日志就可以直接打,不用再手动 new log 静态常量了。

@Slf4jj
public class User {
    public static void main(String[] args) {
        log.info("do something, hello world!")
}

////////  原理  ////////////// 

@Log
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());

@Log4j
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);

@Slf4j
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);

参考链接

https://blog.csdn.net/sunsfan/article/details/53542374
https://www.cnblogs.com/ooo0/p/12448096.html

最后修改:2021 年 07 月 05 日
如果觉得我的文章对你有用,请随意赞赏