@Builder
之前没用过@Builder注解,稍微学习了一下,发现这个注解就是方便new对象的。
我以前在实体类上都是加@AllArgsConstructor、@NoArgsConstructor两个注解来new对象。
但是如果遇到A(a,b,c,d,e,f,g)实体只需要创建A(a,b,c)的对象的情况,就只能再生成一个“死的”构造方法:
public A(String a, String b, String c) {
this.a = a;
this.b = b;
this.c = c;
}
那@Builder注解就是为了减少这种“傻瓜”操作
没用@Builder之前我都是这么创建对象:
用@Builder:
两种方法创建出来的对象是一样的,没有赋值的属性就是空的,但是明显@Builder更方便
structure里可以看到是写了个内部类,具体的方法怎么写的网上可以搜得到
这里有个看得到编译后的代码的:https://www.jianshu.com/p/5e42ecede166
@Singular
实际应用中一般会遇到实体类中包含list、map、set等集合的情况,这种又是怎么处理的?
那么我们可以以下方式来创建对象:
但是多多少少还是有点呆,那就有@Singular来搭配使用:
那么我们就可以这么来创建对象:
Person p5 = Person.builder()
.name("hy")
.sex("女")
.childrenInfo("yzx").childrenInfo("yzy")
.build();
System.out.println(p5);
@Singular使用中需要注意的
- 构造集合的方法名
上面的图如果仔细地话会发现明明我的属性名是childrenInfos,但是structure中的方法名是childrenInfo
是因为**@Singular注解添加的额外方法使用的是集合名的单数形式**
例如childrenInfos会生成childrenInfo;glasses会生成glass;children会生成child
但是有时候属性名不规范或者无法识别时,@Singular就不知道生成啥样的,这个时候编译就报错,提示你:
Can’t singularize this name: “ssss”; please specify the singular explicitly (i.e. @Singular(“sheep”))
解决方法:
在@Singular注解后面加上你要的方法名就可以了
- 对于map、set
对于map集合,键重复时,取后put的键值对
对于set集合,重复添加同一元素不会报错,但是只会有一个
参考:
https://www.baeldung.com/lombok-builder-singular