一、注解的介绍
@Builder注解作用于类,使用了建造者模式来创建对象,可以以链式的形式进行对象的调用赋值
二、案例
声明一个类
@Builder
public class Card {
private int id;
private String name;
private String sex;
}
使用
Card card = Card.builder().id(10).name("张三").sex("男").build();
优点:对象赋值不需要写太多的 set 方法,写法更加方便
三、原理
反编译 Card.class 文件
public class Card {
private int id;
private String name;
private String sex;
Card(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public static CardBuilder builder() {
return new CardBuilder();
}
public static class CardBuilder {
private int id;
private String name;
private String sex;
CardBuilder() {
}
public CardBuilder id(int id) {
this.id = id;
return this;
}
public CardBuilder name(String name) {
this.name = name;
return this;
}
public CardBuilder sex(String sex) {
this.sex = sex;
return this;
}
public Card build() {
return new Card(this.id, this.name, this.sex);
}
public String toString() {
return "Card.CardBuilder(id=" + this.id + ", name=" + this.name + ", sex=" + this.sex + ")";
}
}
}
这样一看就很明显了,加了这个注解,在 Card 类编译后,会在内部生成一个静态的 CardBuidler 类
这个类和 Card 类有一样的属性,并对属性额外实现了一些方法
方法名和属性名一致,方法的作用是对 CardBuilder 对象的属性赋值,方法的返回值就是当前的 CardBuilder 对象
之后还提供了一个 build 方法,方法创建一个 Card 对象,并将 CardBuilder 对象的属性值赋值给 Card 对象,然后将 Card 对象返回
这样的方式可以方便代码的编写,但是他也有一个很明显的缺点,在生成 Card 实例之前,实际上是先创建了一个 Card.CardBuilder 实例,这样很明显占用了内存空间