关于lombok:聊聊使用lombok-Builder踩到的坑

前言什么是lombokLombok我的项目是一个Java库,它会主动插入编辑器和构建工具中,Lombok提供了一组有用的正文,用来打消Java类中的大量样板代码。 对lombok不相熟的敌人,能够浏览一下官网文档,再来看本文。官网文档如下 https://projectlombok.org/ 注释咱们先来看一个小例子 发问: main函数会输入什么? 答案:空指针异样 Exception in thread "main" java.lang.NullPointerException at com.github.lybgeek.msg.test.User.addPositionList(User.java:25) at com.github.lybgeek.msg.test.User.main(User.java:30)答复出正确答案的敌人,下文基本上能够不必看了。可能有些敌人会有疑难,我例子中明明应用了 private List<String> positionList = new ArrayList<>();为什么还会报空指针? 假相就在lombok用@builder生成的class文件中,咱们看下应用@builder,生成的class文件反编译后长啥样 看到我圈红起来的,大家应该就高深莫测。原来当咱们用 User user = User.builder().username("张三").build();时,此时user对象中的positionList就会被userBuilder中的positionList笼罩,而userBuilder中的positionList是null 如何解决办法一:positionList后面加上final润饰 private final List<String> positionList = new ArrayList<>();此时用@Budiler生成class为此时user对象中的positionList用的还是原先的positionList,因而不会呈现空指针异样 办法二:positionList后面加上@Builder.Default注解 @Builder.Default private List<String> positionList = new ArrayList<>();此时用@Budiler生成class为 public static class UserBuilder { private String username; private boolean positionList$set; private List<String> positionList; UserBuilder() { } public User.UserBuilder username(final String username) { this.username = username; return this; } public User.UserBuilder positionList(final List<String> positionList) { this.positionList = positionList; this.positionList$set = true; return this; } public User build() { List<String> positionList = this.positionList; if (!this.positionList$set) { positionList = User.$default$positionList(); } return new User(this.username, positionList); }当positionList$set为false,会给userBuilder的positionList赋值为 ...

September 14, 2021 · 1 min · jiezi

关于lombok:lombok自定义入参校验

咱们应用一个Vo接支出参,如果咱们想通过lombok定义好每个参数的校验,以及校验提醒,则能够参考如下。留神:应用 Hibernate-Validated 进行校验,要应用则必须在类上增加 @Validated 注解,否则是不会失效的 @Datapublic class RequestVo { @ApiModelProperty("作者姓名") @NonNull @Length(min = 1, max = 10, message = "姓名长度必须小于十个字符") private String authorName; @ApiModelProperty("作者年龄") @NonNull @Range(min = 1, max = 8, message = "作者年龄必须小于8岁") private Integer authorAge;}参考链接:https://www.cnblogs.com/xluck...

May 7, 2021 · 1 min · jiezi

关于lombok:springboot-工程下lombok的应用

背景剖析在理论的java我的项目中咱们创立的所有pojo类简直都要为属性增加set/get/toString等相干办法,所有的日志记录相干类可能都要创立日志等对象,这些样板代码既没有技术含量,又影响着代码的好看,同时反复的编码过程会在无形中加大咱们的工作量。 此时Lombok应运而生。 lombok简介概述Lombok是一个第三的Java库,它会主动插入编辑器和构建工具中,Lombok提供了一组有用的正文,用来通知编译过程中的编译工具,在源代码编译成字节码的过程中,在字节码中增加一些量样板代码。 罕用注解剖析@Setter 用于为形容的类生成setter办法,不蕴含final润饰属性。@Getter 用于为形容的类生成getter办法。@ToString 用于为形容的类增加toString办法。@EqualsAndHashCode 用于为形容的类,生成hashCode和equals办法。@NoArgsConstructor 用于为形容的类生成无参的构造方法。@AllArgsConstructor 用于为形容的类生成蕴含类中所有字段的构造方法。@Data用于为形容的类生成setter/getter、equals、canEqual、hashCode、toString办法,如为final属性,则不会为该属性生成setter办法。@Slf4J 用于为形容的类增加一个日志属性对象。lombok装置idea中的装置配置第一步:关上idea的设置窗口,找到plugins菜单,搜寻lombok进行装置,如图所示: 第二步:启动注解解决,如图所示: 第三步:重启idea(可选,有的idea版本须要)。 sts中的装置配置本人百度尝试。 lombok在maven我的项目中利用第一步:增加lombok依赖。 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>annotationProcessor</scope></dependency>第二步:在类上利用lombok注解。 @Data @NoArgsConstructor @AllArgsConstructor public class Goods { private Long id; private String name; private String remark; private Date createdTime;}第三步:编写单元测试类检测Lombok注解利用 @Slf4j@SpringBootTestpublic class GoodsTests{ @Test void testGoods(){ Goods g=new Goods(); g.setId(100L); g.setName("Lombok"); log.info("id的值为{}",g.getId()); log.info("name的值为{}",g.getName()); }}总结(Summary)本大节次要对lombok做了一个剖析,装置和配置,并结合实际我的项目解说了lombok的利用场景及具体利用过程。

December 8, 2020 · 1 min · jiezi

关于lombok:新来的老大说公司以后禁止使用Lombok我表示反对

常常在其它各个中央在说公司禁止应用Lombok,我始终不明确为什么不让用,明天看到一篇文章列举了一下“毛病”,这里我只想狠狠地反驳,看到列举的理由我竟无言以对。 JDK 版本问题 当我想要将现有我的项目的 JDK 从 Java 8 降级到 Java 11 时,我发现 Lombok 不能失常工作了。于是我不得不将所有的 Lombok 注解从我的项目源代码中革除,并应用 IDE 自带的性能生成 getter/setter,equals,hashCode,toString 以及结构器等办法,你也能够应用 Delombok 工具实现这一过程。但这终究会耗费你很多的工夫。 我的反驳:很多公司一旦确定JDK版本在很长的工夫都不会扭转(比方银行我的项目很多都在用jdk1.6,你问他违心降级到jdk11不?),当初都出到14版本了,你看有多少公司会降级!如当初很多公司都在用JDK1.8,任你出到JDK14,我仍然持续应用JDK1.8,等你出到JDK20时我置信Lombok必定会反对更高的版本,那时兼容问题将不存在。 胁迫应用 当你的源代码中应用了 Lombok,恰好你的代码又被其余的人所应用,那么依赖你代码的人,也必须装置 Lombok 插件 (不论他们喜不喜欢),同时还要破费工夫去理解 Lombok 注解的应用状况,如果不那么做,代码将无奈失常运行。应用过 Lombok 之后,我发现这是一种很流氓的行为。 我的反驳:你装不装Lombok 插件不是你喜不喜欢,不是由你集体志愿决定的,这是工作,公司要求怎么做就要怎么做,这是规定。Lombok是一个非常简单的知识点,十分钟就能上手应用,你却埋怨要花费工夫学习,作为程序员不是无时无刻都在学习吗,你有这种埋怨只能你放弃程序员这个工作吧! 可读性差 Lombok 暗藏了 JavaBean 封装的细节,如果你应用 @AllArgsConstructor 注解,它将提供一个巨型结构器,让外界有机会在初始化对象时批改类中所有的属性。 首先,这是极其不平安的,因为类中某系属性咱们是不心愿被批改的; 另外,如果某个类中有几十个属性存在,就会有一个蕴含几十个参数的结构器被 Lombok 注入到类中,这是不理智的行为; 其次,结构器参数的程序齐全由 Lombok 所以制,咱们并不能操控,只有当你须要调试时才发现有一个奇怪的 “小强” 在等着你; 最初,在运行代码之前,所有 JavaBean 中的办法你只能设想他们长什么样子,你并不能看见。 我的反驳:不称心@AllArgsConstructor的做法你能够应用@Builder啊,这个反对你任意程序任意数量的创建对象,你不理解Lombok的其它用法就说它不好。你要看JavaBean中的办法?它有啥难看的,Getter和Setter办法有啥难看的,你不晓得Getter和Setter办法长什么样吗?切实不明确有什么难看的? 代码耦合度减少 当你应用 Lombok 来编写某一个模块的代码后,其余依赖此模块的其余代码都须要引入 Lombok 依赖,同时还须要在 IDE 中装置 Lombok 的插件。 尽管 Lombok 的依赖包并不大,但就因为其中一个中央应用了 Lombok,其余所有的依赖方都要强制退出 Lombok 的 Jar 包,这是一种入侵式的耦合,如果再遇上 JDK 版本问题,这将是一场劫难。我的反驳:咱们在应用其它框架时,那框架引入了成千上万的包,当初要引入一个很小的包都在宽宏大量,Lombok这么好用,简直所有我的项目都会应用到,这还须要强制引入吗,咱们盲目的都会在maven的parent依赖中对立引入了。 ...

November 25, 2020 · 1 min · jiezi

关于lombok:今天-1024为了不-996Lombok-用起来以及避坑指南

Lombok简介、应用、工作原理、优缺点Lombok 我的项目是一个 Java 库,它会主动插入编辑器和构建工具中,Lombok 提供了一组有用的注解,用来打消 Java 类中的大量样板代码。 @[TOC] 简介官网介绍 Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, automate your logging variables, and much more.翻译之后就是: Lombok 我的项目是一个 Java 库,它会主动插入您的编辑器和构建工具中,简化您的 Java 。 不须要再写另一个 getter、setter、toString 或 equals 办法,带有一个正文的您的类有一个性能全面的生成器,能够自动化您的日志记录变量,以及更多其余性能 官网链接 应用增加maven依赖<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <scope>provided</scope></dependency>留神: 在这里 scope 要设置为 provided, 避免依赖传递给其余我的项目 ...

October 24, 2020 · 7 min · jiezi

关于lombok:Lombok应用配置

Lombok:是一个第三库,能够基于lombok中提供的API,在程序编译时主动织入一些办法。这样做的话能够简化咱们对某些办法的编写,例如,省略pojo类中的set办法,get办法,toString等办法的编写。咱们写的java程序能够在编译时,通过lombok主动将这些办法增加到.class文件中,** 第一步:增加依赖<dependency<groupId>org.projectlombok</groupId<artifactId>lombok</artifactId</dependency 补充:1.在sts里能够下载依赖,然而须要本人装置lombok2.idea里只有下载插件在下载依赖就能够了 第二步:找到下载的lombok-xxx.jar依赖所在的地位

September 27, 2020 · 1 min · jiezi