lombok @Accessors简单用法及和Builder

一、@Accessors属性

Accessor的中文含义是存取器,@Accessors用于配置getter和setter方法的生成结果,下面介绍三个属性

@Data
@Accessors(fluent = true)
public class User {
    private Long id;
    private String name;
    
    // 生成的getter和setter方法如下,方法体略
    public Long id() {}
    public User id(Long id) {}
    public String name() {}
    public User name(String name) {}
}

fluent

fluent的中文含义是流畅的,设置为true,则getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象。如下

@Data
@Accessors(chain = true)
public class User {
    private Long id;
    private String name;
    
    // 生成的setter方法如下,方法体略
    public User setId(Long id) {}
    public User setName(String name) {}
}

chain

chain的中文含义是链式的,设置为true,则setter方法返回当前对象。如下

prefix

prefix的中文含义是前缀,用于生成getter和setter方法的字段名会忽视指定前缀(遵守驼峰命名)。如下

@Data
@Accessors(prefix = "p")
class User {
	private Long pId;
	private String pName;
	
	// 生成的getter和setter方法如下,方法体略
	public Long getId() {}
	public void setId(Long id) {}
	public String getName() {}
	public void setName(String name) {}
}

二、@Builder与@Accessors的优劣对比

@Builder

@Builder就是基于建造者模式支持链式操作,但很多时候都是构造失血模式的Bean或者没有共享变量,这时候为了链式操作就新建一个builder是不是有点大材小用
示例:实体类加上@Builder注解(目前更新为@SuperBuilder )

EmsUser emsUser = EmsUser.builder().mobile("").email("").build();

@Accessors

@Accessors就可以解决上述的问题,支持链式操作,同时减少多余对象的创建,builder类元信息又可以减少
示例:实体类加上@Accessors(chain = true)注解

EmsUser emsUser = new EmsUser().setEmail("").setMobile("");

三、@Accessors的坑

有的开源反射工具包对对象进行浅拷贝时,获取set方法元信息时会判断方法返回值是否是void,这时候@Accessors就会出现异常

解决方案:
https://www.cnblogs.com/grey-wolf/p/11812528.html
就因为加了Lombok的@Accessors(chain = true),bean拷贝工具类不干活了

转载:
lombok @Accessors用法
@Builder与@Accessors的优劣对比

上一篇:JDBC的PreparedStatemen


下一篇:基于 java 的汽车租赁系统的设计与实现,源码+论文