你有没有掉进去过这些 Lombok 的 “陷阱“

一、Lombok 东西

Lombok 项目是一个 Java 库,它会自动刺进编辑器和构建东西中,Lombok 提供了一组有用的注解,用来消除 Ja跑车图片va 类中的很多样板代码。跑车图片通过添加注解就能够替换数百行代码从而发生干净,简洁且易于保护跑车最便宜多少钱一辆的Java 类。

Lombok 中常用注解有appointment @Getter/@applicationSetter、@ToStjava怎么读ring、@Data、@NoArgsConstructor 和 @Slf4j,其间最最常用的就是 @Dapproveata 注解,该注解能够生成 getter/setter、equals、Javahash实体类是什么Codjava是什么意思e 以及 toString 等办法。

Lombok 原理

你有没有掉进去过这些 Lombok 的 “圈套“

Lombok本质上就是一个完成了 JSR 269 API的程序,运用 javac 进行跑车两门版领克03编译时,生成方针办法的流程如下:

  1. 跑车简笔画javac 对源代码进行分析生成一实体类型棵笼统语法树(AST)
  2. 接着在运转过程中调用完成了 JSR 269 API 的 lombok 程序
  3. 接着编译器会调用 lombok 程序对上面得到的笼统语法树 AST 进行处理,找到其注解所java训练在类对应的语法树(AST),然后修改该语法树,添加注解对appointment应的办法或代码片段到界说的相应树节点
  4. javac 运用修改实体类图后的笼统语法树生appstore成终究的 class 文件

更多 Lombok 的注解APP

关于 Lombok 更编辑器多注解的运用办法能够参考这两篇文章

  • 你有没有运用过这些编程骚操作(一)- Lombok(Part B编辑器
  • 你有没有运用过这java语言些编程骚操作(一)- Lombjavascriptok(Part A)

Lombok 中存在的圈套

appearance建 maven 项目 lombok-traps 并添加 Lombok 依靠、J编辑器手机版unit 依靠等

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.1</version>
    <scope>test</scope>
</dependency>

在 entity 包中新建一个 Tesla 实体类,并添加 @Da跑车最便宜多少钱一辆ta 注解

@Data
public class Tesla {
    private String tName;
    private String tFactory;
    private String vehicleType;
    private Double vehiclePrice;
}

Lombok 解析单个小写字母的圈套

关于 Lombok 生javaee成的单个小写字母驼峰命名特点的 getter/setter 办法在进行序列化反序列化的时分是无法被 JSON 东西以及 Spring 辨认的,从跑车javaee导致数据丢失

首要在 lombok-traps 项目的 pom.xml 文件中java面试题导入 jackson 的依靠

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>

在 test 包下新增java怎么读测验类java模拟器 TeslaTest,添加一个测验办java是什么意思法 testSingle跑车两门版领克03Lowe编辑器和ide的差异rL实体类型etter

public class TeslaTest {
    @Test
    public void testSingleLowerLetter() throws JsonProcessingException {
        // ObjectMapper 进行序列化和反序列化
        ObjectMapper mapper = new ObjectMapper();
        String teslaJson = "{"vehicleType":"跑车","vehiclePrice":1200000.0,"tFactory":"上海特斯拉超级工厂","tName":"Roadster 2.0"}";
        // 反序列化,将teslaJSON 转换成 tesla 目标
        Tesla tesla = mapper.readValue(teslaJson, Tesla.class);
        System.out.println("转换的 tesla 目标为:" + tesla);
    }
}

履行上述代码,输跑车两门版领克03出成果如下:

你有没有掉进去过这些 Lombok 的 “圈套“

该报错提示 tFactory 是appear无法辨认的特点,说明 Lombok 生成的 getter/setter 办法中与料想的有些不一致,能够在 TeslaTest 中在添加一个办法,编辑器135将一个 Tesla 目标application序列化,

@Test
public void testerialize() throws JsonProcessingException {
    // ObjectMapper 进行序列化和反序列化
    ObjectMapper mapper = new ObjectMapper();
    Tesla tesla = new Tesla();
    tesla.setTName("Roadster 2.0");
    System.out.println(mapper.writeValueAsString(tesla));
}

履行上述代码,输出成果如appearance下:

你有没有掉进去过这些 Lombok 的 “圈套“

关于单字母驼峰命名的特点 Lombok 在生成 getter/setter 办法时会将特点名字母悉数编程小写,导致在反序列化时报错。

能够把这种单个小写字Java母最初的实体类的作用驼峰命名的特点悉数改为小appreciate写,再次测验

@Test
public void testSingleLowerLetter() throws JsonProcessingException {
    // 其他代码保持不变
    String teslaJson = "{"vehicleType":"跑车","vehiclePrice":1200000.0,"tfactory":"上海特斯拉超级工厂","tname":"Roadster 2.0"}";
}

履行 testSin跑车图片大全大图gleLowerLet编辑器哪个好用ter 测验办法的输出成果如下:

转换的 tesla 目标为:Tesla(tName=Roadster 2.0, tFactory=上海特斯拉超级工厂, vehicleType=跑车, vehiclePrice=1200000.0)

反序列化成功,其实这是由appointment于命名标准导致的一个问题,在编码中要尽量防止这种首字母小写第二个字母大写的这种命名标准。

equals 办法和 h编辑器哪个好用ashCode 办法的圈编辑器小说

在 entity 包下界说一个 Fact实体类图orAPPy 类并添加 @Data、@NoArgsConstructor 和 @AllArgsCon跑车简笔画structor 注解。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Factory {
    private Integer id;
    private String factoryName;
}

在 entity 包下界说一个跑车品牌 ShanghaiGigaFactory 类继承 Factory 类,同时类上也标示同样的三个注解。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ShanghaiGigaFactory extends Factory {
    private String address;
    private Integer productivity;
    public ShanghaiGigaFactory(Integer id, String factoryName, String address, Integer productivity) {
        super(id, factoryName);
        this.address = address;
        this.productivity = productivity;
    }
}

在 test 包下跑车品牌新建测验类并新建approach一个测验办法 testEqualsAndHashCodeGenerateByLombok

public class FactoryTest {
    @Test
    public void testEqualsAndHashCodeGenerateByLombok(){
        GigaFactory shanghaiGigaFactory = new GigaFactory(
                4, "Shanghai GigaFactory","Shanghai, China", 5000000
        );
        GigaFactory shanghaiGigaFactory2 = new GigaFactory(
                3, "Shanghai GigaFactory 2","Shanghai, China", 5000000
        );
        System.out.println(shanghaiGigaFactory.equals(shanghaiGigaFactory2));
    }
}

履行该测验办法,输出结APP果如下:

你有没有掉进去过这些 Lombok 的 “圈套“

输出成果为 false 而实体类的作用非 true,说明只比较了子类 GigaappetiteFaapplicationctory 中的 address 特点和 productivity 特APP点的值是否相同,而没有比较父类的 id 特点和 name 特点。

这是由于 Lombok 的 @Data 和 @EqualsAndHashCode 注解在生实体类的效果成 equals 办法和 hashCode 办法时默许不会将父类的特点进行比较,只会比较子类的特点,这是javascript由 @EqualsAndHashCjava面试题od实体类的效果e 的 cal跑车两跑车车标门版领克03lSuper 特点控制的,该特点默许为APP false。

在 GigaFactory 类java是什么意思上添加注解 @EqualsAndHashCode(callSuper =appetite true),此刻再次履行测验类中的 test实体类图E编辑器手机版qualsAndH编辑器ashCodeGenerateByLombo编辑器怎么打开k 办法apple,运转成果如下:

你有没有掉进去过这些 Lombok 的 “圈套“
输出appear成果符合预期。

发表评论

提供最优质的资源集合

立即查看 了解详情