前言
Lombok是一个Java库,它使用注解来简化Java代码的编写。通过添加注解,Lombok能够自动生成常见的代码,如getter和setter方法、构造函数、equals和hashCode方法等,从而减少了开发者的重复劳动。
具体来说,Lombok的主要优势在于它可以在编译时根据注解自动生成这些代码,使得开发者不需要手动编写这些样板代码。这不仅提高了开发效率,也使得代码更加简洁和易读。同时,Lombok还提供了其他有用的功能,如自动化日志变量等。
总的来说,Lombok是一个强大的工具,它能够帮助开发者提高Java开发效率,减少冗余代码,使代码更加整洁和易于维护。然而,使用Lombok时,开发者需要确保团队中的所有成员都熟悉该工具,以避免在协作开发中出现理解上的障碍。同时,对于某些复杂的业务逻辑,手动编写的代码可能更加灵活和可控。
一、准备
1. 安装插件
File>Settings>Plugins
2. 引入库
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
<scope>provided</scope>
</dependency>
二、使用
1.实体类
package org.example.spel.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Create by zjg on 2024/4/22
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class Summons {
private int id;
private String defendantName;
private String defendantGende;
private int defendantAge;
private String defendantUnit;
private String caseNature;
private String plaintiffName;
private Date hearingDate;
private String hearingVenue;
private String courtName;
private String courtAddress;
private String contactPhone;
private Date summonsDate;
public String format(Date date,String pattern) {
return new SimpleDateFormat(pattern).format(date);
}
}
2.测试类
package org.example.spel.lombok;
import org.example.spel.po.Summons;
import java.time.ZonedDateTime;
import java.util.Date;
/**
* Create by zjg on 2024/4/22
*/
public class Main {
public static void main(String[] args) {
Summons summons = new Summons();
summons.setId(1);
System.out.println(summons.getId());
System.out.println(summons.toString());
Summons build = Summons.builder().id(2).defendantName("被告姓名").defendantGende("男").defendantAge(25).defendantUnit("被告单位")
.caseNature("案例性质").plaintiffName("原告姓名").hearingDate(Date.from(ZonedDateTime.now().plusDays(7).withHour(10).withMinute(0).withSecond(0).toInstant()))
.hearingVenue("听证会地点").courtName("法院名称").courtAddress("法院地址").contactPhone("联系电话").summonsDate(new Date()).build();
System.out.println(build.toString());
}
}
3.测试结果
1
Summons(id=1, defendantName=null, defendantGende=null, defendantAge=0, defendantUnit=null, caseNature=null, plaintiffName=null, hearingDate=null, hearingVenue=null, courtName=null, courtAddress=null, contactPhone=null, summonsDate=null)
Summons(id=2, defendantName=被告姓名, defendantGende=男, defendantAge=25, defendantUnit=被告单位, caseNature=案例性质, plaintiffName=原告姓名, hearingDate=Mon Apr 29 10:00:00 CST 2024, hearingVenue=听证会地点, courtName=法院名称, courtAddress=法院地址, contactPhone=联系电话, summonsDate=Mon Apr 22 20:00:41 CST 2024)
可以看到,实体类中没有对应的get和set方法,在程序运行的时候却能正常使用,toString方法也帮我们打印出了所有的属性。
4. 日志
package org.example.spel.lombok;
import lombok.extern.log4j.Log4j2;
import org.example.spel.po.Summons;
import java.time.ZonedDateTime;
import java.util.Date;
/**
* Create by zjg on 2024/4/22
*/
@Log4j2
public class Main {
public static void main(String[] args) {
Summons summons = new Summons();
summons.setId(1);
log.debug(summons.getId());
log.debug(summons.toString());
Summons build = Summons.builder().id(2).defendantName("被告姓名").defendantGende("男").defendantAge(25).defendantUnit("被告单位")
.caseNature("案例性质").plaintiffName("原告姓名").hearingDate(Date.from(ZonedDateTime.now().plusDays(7).withHour(10).withMinute(0).withSecond(0).toInstant()))
.hearingVenue("听证会地点").courtName("法院名称").courtAddress("法院地址").contactPhone("联系电话").summonsDate(new Date()).build();
log.debug(build.toString());
}
}
[2024-04-22 20:02:13.456][main][DEBUG]- org.example.spel.lombok.Main.main(Main.java:16) - 1
[2024-04-22 20:02:13.519][main][DEBUG]- org.example.spel.lombok.Main.main(Main.java:17) - Summons(id=1, defendantName=null, defendantGende=null, defendantAge=0, defendantUnit=null, caseNature=null, plaintiffName=null, hearingDate=null, hearingVenue=null, courtName=null, courtAddress=null, contactPhone=null, summonsDate=null)
[2024-04-22 20:02:13.534][main][DEBUG]- org.example.spel.lombok.Main.main(Main.java:21) - Summons(id=2, defendantName=被告姓名, defendantGende=男, defendantAge=25, defendantUnit=被告单位, caseNature=案例性质, plaintiffName=原告姓名, hearingDate=Mon Apr 29 10:00:00 CST 2024, hearingVenue=听证会地点, courtName=法院名称, courtAddress=法院地址, contactPhone=联系电话, summonsDate=Mon Apr 22 20:02:13 CST 2024)
我这里是用的log4j2的日志,所以使用@Log4j2注解,不需要像以前每个类都要写
private static Logger logger = LoggerFactory.getLogger(Main.class);
现在加一个注解就可以了。
三、常用注解
以下是一个Lombok常用注解及其描述的表格:
注解 | 描述 |
---|---|
@Getter | 为类的属性自动生成getter方法。 |
@Setter | 为类的属性自动生成setter方法。 |
@ToString | 自动生成包含所有字段的toString方法。 |
@EqualsAndHashCode | 自动生成equals和hashCode方法。 |
@NoArgsConstructor | 自动生成一个无参数的构造函数。 |
@AllArgsConstructor | 自动生成一个包含所有字段的构造函数。 |
@RequiredArgsConstructor | 自动生成一个包含需要特殊处理的字段(如final字段)的构造函数。 |
@Data | 这是一个复合注解,它包括了@Getter、@Setter、@EqualsAndHashCode、@ToString和@RequiredArgsConstructor的功能。 |
@Value | 类似于@Data,但是所有字段都是final的,并会生成所有字段的getter方法,但不会生成setter方法,并且类会被设置为final。 |
@Builder | 允许你以构建器模式构建对象。 |
@Slf4j | 自动为类添加一个SLF4J的日志记录器实例。 |
@Cleanup | 自动管理资源,如关闭流或连接,在try-with-resources语句中使用。 |
总结
Lombok最大的好处是让代码更加简洁,当你的实体对象属性数量几十或者上百的时候,添加些许注解就可省略上百行代码,岂不美哉。
坏处也有,它是侵入式的;举个例子:我在代码中使用了Lombok,并将代码提交到git,同事小王更新代码之后发现他本地无法启动了,小王也进行了Lombok插件的安装,之后就正常了,就跟流氓软件似的,所以有好有坏,因此在使用Lombok时也需要根据具体情况进行权衡和选择。