关于lombok
,常用的方法已经烂大街了,今天挖掘点不一样的。在项目中,当我们某个类的属性过多时,如果使用构造方法创建对象那将是一件很恐怖的事情,我甚至不知道每个参数对应的是什么意思,因此最常规的解决手段是按需添加一个初始化对象的静态方法,由于不是所有的属性都需要自定义,因此,这个方法就比较人性化,也让代码更加易于理解和使用:
class Car{
private String origin = "德国";
private String model;
private Car(String model){
this.model = model;
}
public static Car of(String model){
return new Car(model);
}
}
或者我们也可以使用builder
模式来做:
class Car{
private String origin;
private String model;
private Car(String model){
this.model = model;
}
private Car(Builder builder){
this.origin = builder.origin;
this.model = builder.model;
}
public static Car of(String model){
return new Car(model);
}
public static Builder builder(){
return new Builder();
}
public static class Builder{
private String origin;
private String model;
public Builder origin(String origin){
this.origin = origin;
return this;
}
public Builder model(String model){
this.model = model;
return this;
}
public Car build(){
return new Car(this);
}
}
}
如果每个类都要这么写,那不是要把人累死,所以,就有了轮子来帮我们完成这些枯燥的操作,相信使用过lombok
的小伙伴肯定不少,不过可能大多数小伙伴用的最多的一定是@Data
、@Getter
这些用来代替getter和setter方法的注解,所以今天我们就利用lombok
来让我们上面的代码简化。
对象初始化的静态方法:
@Data
@RequiredArgsConstructor(staticName = "of")
class Car{
@NonNull
private String origin;
@NonNull
private String model;
}
源码剖析(查看生成的class文件
反编译的java
代码):
class Car{
@NonNull
private String origin;
@NonNull
private String model;
// 省略get、set方法
private Car(@NonNull String origin, @NonNull String model) {
if (origin == null) {
throw new NullPointerException("origin is marked @NonNull but is null");
} else {
this.origin = origin;
}
if (model == null) {
throw new NullPointerException("model is marked @NonNull but is null");
} else {
this.model = model;
}
}
public static Car of(@NonNull String origin, @NonNull String model) {
return new Car(origin, model);
}
}
通过对源码的查阅之后发现,@RequiredArgsConstructor
注解实际上做了两件事:1、添加了一个实例化对象的静态方法;2、添加了一个私有构造方法服务于该静态方法,在需要自定义的字段上面加入@NonNull
后,这些字段就会按照属性在类中声明的先后顺序作为该方法的形参,同时会对这些字段做非空验证,如果为空就会报空指针异常,这是一个坑,需要注意。关于建造者模式,代码其实和我们上面手写的没有太大出入,所以这里就不做分析了。