构造者模式

文章介绍了在Java中处理属性多的对象时,如何通过构造者模式创建和赋值。对比了全参构造和set方法的不足,并提出使用链式调用的set方法。接着展示了如何通过静态内部类Builder实现这一模式,提供了一种更清晰、可读性更强的方式来创建复杂对象。
摘要由CSDN通过智能技术生成

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注解)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值