一、安装插件,eclipse 对于 lombok 的支持
二、引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version> <!-- Spring Boot 项目此部分可以不写 -->
</dependency>
三、基本注解的使用(注解属性非必选)
@AllArgsConstructor:作用于类,生成参数为所有实例变量的构造函数
@Builder:作用于类,将其变成建造者模式1
@Cleanup:作用于变量,自动关闭资源,针对实现了 java.io.Closeable 接口的对象有效
@CustomLog:作用于类,生成 log 对象,用于记录日志2
@Data:作用于类,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
@EqualsAndHashCode:作用于类,覆盖默认的 equals 和 hashCode3
@Generated:用于标记类、变量、方法是自动生成的,没什么用
@Getter:作用于类,生成该类所有的实例变量的 getter 方法。作用于变量,生成变量的 getter 方法
@NoArgsConstructor:作用于类,生成无参构造方法
@NonNull:作用于成员变量和参数中,标识不能为空,否则抛出空指针异常
@RequiredArgsConstructor:作用于类,生成包含 final 和 @NonNull 注解的成员变量的构造方法
@Setter:作用于类,生成该类所有的实例变量的 setter 方法。作用于变量,生成该变量的 setter 方法
@Singular:作用于集合字段,需要配合 @Builder 使用
@SneakyThrows:作用于方法,对异常进行捕捉并抛出
@Synchronized:作用于方法,可以替换 synchronize 关键字或 lock 锁
@ToString:作用于类,覆盖默认的 toString() 方法
@val,作用于类、变量,主要用于声明变量的类型,注解将从初始化程序表达式中推断类型,生成的变量是 final 不可以变
@Value:作用于类,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @RequiredArgsConstructor
@var:和 @val 一样,两者区别在于 var 不加 final
@With:作用于类、变量,生成 with + 变量名的方法,返回当前对象
三、外部注解的使用
@CommonsLog,@Log,@JBossLog,@Log4j,@Log4j2,@Slf4j,@XSlf4j:日志注解,作用于类
四、实验性注解的使用
@Accessors:类似于 @Builder 支持链式调用,需要配合 @Setter、@Getter 等注解使用,作用于类、变量
@Delegate:作用于容器变量,为该变量生成一堆常用的方法,这些方法都是容器中的方法
@ExtensionMethod:作用于类,向类添加方法,无需创建新的子类
@FieldDefaults:作用于类,定义变量的访问修饰符以及是否加 final
@FieldNameConstants:作用于类,生成一个包含所有成员变量的内部类或者内部枚举,内部类中每个字段值即为字段名,并且值不可变
@Helper:作用于方法内部类,使内部类中的方法暴露在外面可以被直接调用,不建议使用
@NonFinal:作用于类、变量,表示变量不加 final
@PackagePrivate:作用于类和变量,相当于访问修饰符的 default,没什么用
@SuperBuilder:作用于类,@Builder 的升级版
/**
* @Builder 不支持对基类成员属性的构造
* 而 @SuperBuilder 就是为了解决这个问题而产生的
* 基类和派生类不能同时存在 @Builder
* 如果基类使用了 @Builder,则派生类需要写出全参构造方法
*/
public class 马小茜 {
private Integer age;
private String name;
}
@Builder
public class 龙一一 extends 马小茜 {
public static void main(String[] args) {
龙一一.builder().name("龙一一").build(); // 这个时候是不能对 name 属性赋值
}
}
/**
* 如果基类使用了 @SuperBuilder
* 那么派生类必须存在 @SuperBuilder 或者写出参数为:基类Builder<?, ?> 的构造方法
*
* builderMethodName:创建内部静态类的方法名,默认值为 builder
* buildMethodName:创建实体类的方法名,默认值为 build
* toBuilder:设置为 true 可以对这个对象进行拷贝生成新的对象,可以在修改,默认为 false。
* setterPrefix:setter 方法的前缀
*/
@SuperBuilder(builderMethodName = "builder", buildMethodName = "build", toBuilder = true, setterPrefix = "k")
public class 马小茜 {
private Integer age;
private String name;
}
@SuperBuilder
public class 龙一一 extends 马小茜 {
public static void main(String[] args) {
龙一一.builder().kName("龙一一").build();
}
}
@Tolerate:实现对冲突的兼容,作用于方法上,没什么大用,可以配合 @Builder 使用
@UtilityClass:作用于类,将类标记为 final,并且类、内部类中的方法、字段都标记为 static
/**
* 1.将类标记为 final
* 2.类和内部类中的方法、字段都标记为 static
* 3.无法实例化
*/
@UtilityClass
public class 古力娜扎 {
public String name;
public int aaa() {
return 0;
}
public static void main(String[] args) {
古力娜扎.aaa();
String a = 古力娜扎.name;
}
}
@WithBy4
五、Lombok 的优缺点
-
优点:
能通过注解的形式自动生成构造器、getter / setter、equals、hashcode、toString 等方法,提高了一定的开发效率
让代码变得简洁,不用过多的去关注相应的方法
属性做修改时,也简化了维护为这些属性所生成的 getter / setter 方法等 -
缺点:
不支持多种参数构造器的重载
虽然省去了手动创建一系列方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度