Spring Boot扩展包:Lombok
Lombok是一个在Spring Boot工程中常用的开发者工具扩展包,它能以简单的注解的形式简化java代码,提高开发人员的开发效率。
Lombok是一个Java库,旨在通过自动化一些繁琐的编码任务来简化Java代码的编写。它通过提供一组注解来实现,这些注解可以自动生成通常需要手动编写的代码,如getter、setter、构造函数、equals、hashCode等。这有助于减少样板代码,提高代码的可读性和维护性
1 安装
1.1 添加Maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
1.2 安装Idea插件
点击Preferences..->Plugins, 搜索Lombok安装。
编译时出错,可能是没有enable注解处理器。Annotation Processors > Enable annotation processing。设置完成之后程序正常运行。
2 使用
2.1 @Getter和@Setter
- @Getter: 为类中的字段生成相应的getter方法。
- @Setter: 为类中的字段生成相应的setter方法。
import lombok.Getter;
import lombok.Setter;
public class User {
@Getter
@Setter
private Long ID;
@Getter
@Getter
private String username;
}
2.2 @ToString
自动生成toString()方法,以便在日志记录和调试时方便查看对象的内容。
import lombok.ToString;
@ToString
public class User {
private Long ID;
private String username;
}
2.3 @NoArgsConstructor和@AllArgsConstructor:
- @NoArgsConstructor: 生成无参构造函数。
- @AllArgsConstructor: 生成包含所有字段的参数构造函数。
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
public class User {
private User ID;
private String username;
}
2.4 @EqualsAndHashCode
自动生成equals()和hashCode()方法,用于比较对象的相等性和生成哈希码。
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class User {
private Long ID;
private String username;
}
2.5 @Data
为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
import lombok.Data;
@Data
public class User {
private Long ID;
private String username;
}
2.6 @Builder
@Builder
注解为类生成相对略微复杂的构建器API。
- 其作用于类,将其变为建造者模式;
- 可以以链的形式调用;
- 初始化实例对象生成的对象是不可以变的,可以在创建对象的时候进行赋值;
- 如果需要在原来的基础上修改可以加set方法,final字段可以不需要初始化;
- 它会生成一个全参的构造函数。
属性:
- @Builder.Default: 非final的字段可以有默认值;
- builderMethodName: 指定创建内部静态类的方法名,默认值为build;
- buildMethodName: 指定创还能实体类的方法名,默认为build;
- builderClassName: 指定内部的静态类名,默认值为"",默认创建的类名thisClassBuilder
- toBuilder: 设置为true可以对这个对象拷贝生成新的对象,可以再修改,默认为false。
- access: 设置builderMethodName的访问权限修饰符,默认为public,共有PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE;
- setterPrefix: 设置setter方法的前缀,默认为"";
示例:
import lombok.Builder;
@Builder(builderMethodName="builder", buildMethodName="build", builderClassName="", toBuilder=true, access=AccessLevel.PUBLIC, setterPrefix="")
public class Person {
@Builder.Default
private String name = "刘亦菲";
private String sex;
private final Integer age = 18; // final 字段加不加 Default 都可以初始化成功
public static void main(String[] args) {
Person person = Person.builder().build(); // 如果没有加 Default,那么输出的 name 结果是 null。
/**
* 类似于拷贝,修改了 name 值,age 值还是原来的
* 如果 toBuilder = false,则没有 toBuilder 方法
*/
person = yifei.toBuilder().name("李四").build();
}
}
支持泛型构建
@Builder
public class Person<T> {
public void person(Person<T> yi) {
person = Person.<T>builder().builder();
}
}
2.6.1 无法定义无参数构造的解决办法
- 加
@AllArgsConstructor
注解 - 或者加
@Tolerate
注解
2.6.2 原理
@Builder
做了什么
- 创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类相同的属性(称为构建器)
- 在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性
- 在构建器中:创建一个无参的 default 构造函数
- 在构建器中:实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)
- 在构建器中:会创建一个 build 方法,调用 build 方法,就会根据设置的值进行创建实体对象
- 在构建器中:会生成一个 toString 方法
- 在实体类中:会创建一个 builder 方法,它的目的是用来创建构建器
@Builder
public class User {
private String username;
private String password;
}
编译后相当于
public class User {
private String username;
private String password;
User(String username, String password) {
this.username = username;
this.password = password;
}
public static User.UserBuilder builder() {
return new User.UserBuilder();
}
public static class UserBuilder {
private String username;
private String password;
UserBuilder() {}
public User.UserBuilder username(String username) {
this.username = username;
return this;
}
public User.UserBuilder password(String password) {
this.password = password;
return this;
}
public User build() {
return new User(this.username, this.password);
}
public String toString() {
return "User.UserBuilder(username=" + this.username + ", password=" + this.password + ")";
}
}
}
3 Lombok的优缺点
3.1 优点
- 能通过注解的形式自动生成构造器,getter/setter,equals,hashCode,toString等方法,提高了一定开发效率;
- 让代码变得简洁,不用过多地去关注相应的方法;
- 属性做修改时,也简化了维护这些属性所生成的getter/setter方法;
3.2 缺点
- 不支持多种参数的构造器的重载;
- 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度。
发表回复