概述
lombok我们主要用来减少get、set和空参和全参的重复性代码,本文希望深入学习来理解其原理和避免一些坑。其官网描述1为:
Project Lombok aims to reduce the prevalence of some of the worst offenders by replacing them with a simple set of annotations.
(Project Lombok 旨在通过用一组简单的注解替换一些最严重的违例来减少它们的流行。)
关键字:lombok学习,@Getter ,@Setter,@NonNull,@ToString,@EqualsAndHashCode,@Data,@Cleanup,@Synchronized,@SneakyThrows
环境
- jdk:1.8
- projectlombok:1.18.24
注解
- @Getter 、@Setter
- @NonNull
- @ToString
- @EqualsAndHashCode
- @Data
- @Cleanup
- @Synchronized
- @SneakyThrows
@Getter 、@Setter
@Getter
@Getter注解用来生成成员变量的get方法。
@Getter private String catName
等效于java代码:
private String catName;
public String getCatName() {
return this.catName;
}
其中@Getter包含三个可选参数value(default lombok.AccessLevel.PUBLIC)、onMethod(default {})、lazy(default false)
-
value是用来指定生成的get方法的访问级别,默认为public,可以使用提供的访问级别枚举进行指定
public enum AccessLevel { PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE, /** Represents not generating anything or the complete lack of a method. */ NONE; }
比如指定为private
@Getter(value = AccessLevel.PRIVATE) private String catName;
等效于java代码
private String catName; private String getCatName() { return this.catName; }
-
onMethod的类型是AnyAnnotation[ ],在生成的getter方法上加上特定的注解列表(例子中的@Interface仅代表是注解,并无实际含义),注意onMethod后面的下划线。
@Getter(onMethod_ = @Interface) private String catName;
等效于java代码
private String catName; @Interface public String getCatName() { return this.catName; }
-
lazy这个属性默认为false,类似于单例模式的懒加载,当实例化该类比较耗时,且占用较大的空间时,我们不希望频繁的创建新的实例,而使用lazy进行修饰字段时,这个字段相对于其它字段部分会隐藏起来,使用一个原子缓存,并且不需要进行并发锁的处理,因为lombok会进行锁的操作,在get的时候会进行双重检验来创建对象,注意lazy修饰的字段必须是final类型,所以需要进行初始化。
@Getter(lazy = true) private final String catName = "Tom";
等效于java代码
private final AtomicReference<Object> catName = new AtomicReference(); public String getCatName() { Object value = this.catName.get(); if (value == null) { synchronized(this.catName) { value = this.catName.get(); if (value == null) { String actualValue = "Tom"; value = "Tom" == null ? this.catName : "Tom"; this.catName.set(value); } } } return (String)((String)(value == this.catName ? null : value)); }
@Setter
@Setter注解是用来生成成员变量的set方法
@Setter private String dogName;
等效于java代码
private St