Loading... ## @NonNull 这个注解可以用在成员方法、构造方法的参数前面或者用在成员变量上方,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常。 ``` java //成员方法参数加上@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,不然会有各种坑等着你 ```java @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 会一起用在同个类上,既方便我们流式写代码,也方便框架做事。 ```java @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 静态常量了。 ```java @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 日 02 : 11 PM © 允许规范转载