一、@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的优劣对比