我们在工作中写代码会遇到一种情况,要给对象属性赋值,通常方式有两种:
方式1. Animal animal=new Animal("3岁",20kg,"牛奶"); 使用构造方法来进行赋值。
方式2. Animal animal=new Animal(); 调用对象.set方法赋值。
animal.setAge("3岁");
animal.setWeight("20kg");
animal.setFood("牛奶");
在某些场景下,是会有一些弊端:
第一种方式: 相当于在构造函数里传递参数,但这样加入参数的时候,不能明确的知道往这个对象里加入了什么属性的内容。
假如有一个类,类里面有几十个参数属性,如果通过构造函数来赋值:
①看起来费劲
②不能清楚知道这些参数代表了什么含义
第二种方式: 对象.set函数名设置值,但是这种写法,略显冗余。
假如有几十个参数:
①冗余 ,要一个一个的设置,还不能连着写。
②费劲
使用构造者模式,不用构造方法赋值,也不用对象.set方法赋值。
在设计模式中有构造者模式(builder),在类的构造器或静态工厂具有多个参数。设计这种类时,builder模式就是个不错的选择。
Demo代码如下:
具体构造者的思路:
public class Purchase { 外部类,下面是属性。外部类的属性与内部类的属性完全一样。
// 当前这个类,有如下的属性
private final String shipNo;
private final String menuId;
private final String menuName;
private final Double price;
public static class Builder { 为了给对象的属性赋值,在内部构造了一个静态内部类,叫Builder;
// 这里的属性和外部类的数属性是一模一样的。那我们怎么来给外部类的属性赋值呢?我们创建内部类的对象,然后通过内部类对象属性来给外部类属性赋值。
private final String shipNo;
private String menuId;
private String menuName;
private final Double price = 0.0;
public Builder(String shipNo) { // 可以通过构造方法给属性赋值,那这个属性是必须要填的。
this.shipNo = shipNo;
}
public Builder menuId(String val) { // 除了构造方法之外,还想要给别的属性赋值
menuId = val;
return this; // 把当前赋过值的builder给返回
}
public Builder menuName(String val){
menuName=val;
return this; // 赋完值,把当前的内部类返回
}
public Purchase build() { // 内部类提供了个方法,叫build(),返回的是外部类。
return new Purchase(this); // 在build()方法里面,创建了个外部类对象。把内部类自己作为外部类的构造方法传参进去,是Builder类型。
}
}
private Purchase(Builder builder) { // 调用Purchase构造方法的时候,把静态内部类对象传进来
// 在外部类的构造方法里面,把内部类的对象数据赋值给外部类的属性
shipNo = builder.shipNo;
menuId = builder.menuId;
menuName = builder.menuName;
price = builder.price;
}
}
这样做的好处:
如果我现在有几十个属性,但是我并不需要给每一个属性赋值,可能我只需要给其中的5个属性赋值,这样我们就可以调用静态内部类里面的方法来单独给相关属性赋值。
这样我在构建对象时,就没有必要去写构造参数了,把参数从外部传进去,只用传入一个构造者就可以了。———— 这种方式就是构造器设计模式。
其结果就是这种设置属性是多个方法连接的方式:
public static void main(String[] args) {
Purchase p=new Builder("S0001").menuId("11").menuName("宫保").build();
// 先创建一个内部类对象。接下来给内部类的对象属性赋值。
// 赋完值之后,调用.build()方法,这样就能够返回一个外部类对象。
// 而且在返回外部类对象时,把内部类的属性赋值给Purchase p。靠这种方式赋值。
System.out.println(p.menuName);
}
在创建对象时,直接把构造器Builder创建出来,然后给构造器Builder 的属性赋值,需要哪个属性就给哪个属性赋值。
也有另一种方式,省去代码的builder写法,就是使用lombok:
import lombok.Builder;
import lombok.Data;
@Builder
@Data
public class LomBokDemo {
private String name;
private Integer age;
public static void main(String[] args) {
LomBokDemo wyz = LomBokDemo.builder().age(12).name("张三").build();
System.out.println(wyz);
}
}
希望大家可以关注下公众号,会定期分享自己从业经历、技术积累及踩坑经验,支持一下,鞠躬感谢~
关注公众号,回复“资料全集”,不定期最新大数据业内资讯。