# lombok 注意事项

Lombok 简化了 java 又臭又长的代码,平时还使用建造者这样的写法,写起来清晰很多。但是在实际使用中也遇到不少坑,以下为注意事项

# 建造者的问题

我们都知道给实体添加 @Builder 后就可以使用建造者,但如果实体发生了继承,例如继承了 BaseEntity ,却无法建造 BaseEntity 中的属性。于是 Lombok 推出了 @SuperBuilder 注解(该注解还处于实验阶段),在父类和子类上都添加改注解,就可以一起建造父类和子类的属性。

@Data
@SuperBuilder(toBuilder = true)
public class Parent {
    private int id;
    private String name;
}

@Data
@SuperBuilder
public class Child extends Parent {
    private String ext;
}

Child c1 = Child.builder()
                .id(1)
                .name("名称")
                .ext("子类属性ext")
                .build();

Lombok 在 1.18.2 中支持了改注解,idea 的 Lombok 插件也已支持该注解。

# ToString 和 EqualsAndHashCode 的问题

如果实体发生了继承,默认情况下 @ToString@EqualsAndHashCode 都不会将父类的属性加入计算,如果要将父类属性也加入计算,可以配置 callsuper 的值为 true:@ToString(callSuper=true)@EqualsAndHashCode(callSuper=true)

但是每个实体都这样写太过麻烦,并且@Data 注解也失去了意义,Lombok 还支持全局统一的配置,新建 lombok.config 配置文件,加入以下信息:

config.stopBubbling=true
lombok.equalsAndHashCode.callSuper=call
lombok.toString.callSuper=call

注意: 在低版本的 Lombok 中,lombok.toString.callSuper=call 不生效,经过测试 在 1.18.8 中可以使用

# lombok.config 配置文件作用范围

lombok.config 配置文件只对父类目录下的所有 java 文件才生效,所以在 spring 项目中,无法将配置文件放在 resource 文件夹下,建议放在项目跟路径。

Lombok 不仅适用于 spring 项目,它适用于所有的 java 项目,所以对作用范围进行这样的设定。

# 配合 mapstruct 使用

mapstruct 提供了配合 lombok 的使用方式,即 mapstruct 生成的代码为建造者