1.构造者模式:
理解:在属性多的对象中创建对象的同时给属性赋值使用
--下面用一个例子帮助你理解
1.对象
@Data
@AllArgsConstructor
public class TradeSkuOrderBean {
// 窗口起始时间
String stt;
// 窗口结束时间
String edt;
// 品牌 ID
String trademarkId;
// 品牌名称
String trademarkName;
// 一级品类 ID
String category1Id;
// 一级品类名称
String category1Name;
// 二级品类 ID
String category2Id;
// 二级品类名称
String category2Name;
// 三级品类 ID
String category3Id;
// 三级品类名称
String category3Name;
// sku_id
String skuId;
// sku 名称
String skuName;
// spu_id
String spuId;
// spu 名称
String spuName;
// 原始金额
BigDecimal originalAmount;
// 活动减免金额
BigDecimal activityAmount;
// 优惠券减免金额
BigDecimal couponAmount;
// 下单金额
BigDecimal orderAmount;
// 时间戳
Long ts;
}
2.需求
请创建上面对象:
方法一:
全参构造 --很多属性,很容易混淆(属性多还是不清晰,不好用)
TradeSkuOrderBean tradeSkuOrderBean = new TradeSkuOrderBean(里面赋值);
方法二:
new对象(无参构造),然后set设置值 --我想创建对象的同时设置值,你这个就不行咯吧
TradeSkuOrderBean tradeSkuOrderBean = new TradeSkuOrderBean();
tradeSkuOrderBean.setSkuName("手机");
当属性多的时候,上面两种方法都有缺点:都不好用
想法:能不能将set方法自己写一下,变成链式调用:例如:(你能这样想很好)
@ToString
public class Dept {
private Integer deptno;
private String dname;
private Long ts;
public Dept setDeptno(Integer deptno) {
this.deptno = deptno;
return this;
}
public Dept setDname(String dname) {
this.dname = dname;
return this;
}
public Dept setTs(Long ts) {
this.ts = ts;
return this;
}
public static void main(String[] args) {
Dept zhang = new Dept().setDeptno(3).setDname("zhang").setTs(1L);
System.out.println(zhang);
}
}
你能这样想很好,但是这是别人set方法呀,哥哥--你这不是不遵守规则咯嘛
于是:就可以用一个静态类部类(Builder)来解决这个问题:
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Dept {
private Integer deptno;
private String dname;
private Long ts;
public Dept(Builder builder) {
this.deptno=builder.deptno;
this.dname = builder.dname;
this.ts = builder.ts;
}
public static class Builder{
private Integer deptno;
private String dname;
private Long ts;
public Builder setDeptno(Integer deptno) {
this.deptno = deptno;
return this;
}
public Builder setDname(String dname) {
this.dname = dname;
return this;
}
public Builder setTs(Long ts) {
this.ts = ts;
return this;
}
public Dept build(){
return new Dept(this);
}
}
public static void main(String[] args) {
Dept zhang = new Builder()
.setDeptno(12)
.setDname("zhang")
.setTs(45L)
.build();
System.out.println(zhang);
}
}
总结:如果在flink中遇到要调用的类,没有提供有参构造,这看看Builder方法
假如在我们自己写类的时候,属性比较多,可以使用构造者(简单使用:lombok中有@Builder注解)