提升代码能力之构造者模式创建对象

目录

使用场景

构造者模式创建对象

 引入依赖

构造者创建对象


使用场景

        适用于实体类的属性比较多时,因此当我们通过new的方式创建对象时,一般来说我们需要逐个字段的去赋值

举个实体类例子,如下:

public class TradeUserSpuOrderBean {

    public TradeUserSpuOrderBean(String stt, String edt, String trademarkId, String trademarkName, String category1Id, String category1Name, String category2Id, String category2Name, String category3Id, String category3Name, Set<String> orderIdSet, String skuId, String userId, String spuId, String spuName, Long orderCount, Double orderAmount, Long ts) {
        this.stt = stt;
        this.edt = edt;
        this.trademarkId = trademarkId;
        this.trademarkName = trademarkName;
        this.category1Id = category1Id;
        this.category1Name = category1Name;
        this.category2Id = category2Id;
        this.category2Name = category2Name;
        this.category3Id = category3Id;
        this.category3Name = category3Name;
        this.orderIdSet = orderIdSet;
        this.skuId = skuId;
        this.userId = userId;
        this.spuId = spuId;
        this.spuName = spuName;
        this.orderCount = orderCount;
        this.orderAmount = orderAmount;
        this.ts = ts;
    }

    // 窗口起始时间
    String stt;
    // 窗口结束时间
    String edt;
    // 品牌 ID
    String trademarkId;
    // 品牌名称
    String trademarkName;
    // 一级品类 ID
    String category1Id;
    // 一级品类名称
    String category1Name;
    // 二级品类 ID
    String category2Id;
    // 二级品类名称
    String category2Name;
    // 三级品类 ID
    String category3Id;
    // 三级品类名称
    String category3Name;

    // 订单 ID
    Set<String> orderIdSet;

    // sku_id
    String skuId;

    // 用户 ID
    String userId;
    // spu_id
    String spuId;
    // spu 名称
    String spuName;
    // 下单次数
    Long orderCount;
    // 下单金额
    Double orderAmount;
    // 时间戳
    Long ts;
}

        可以看到,我们new对象时,如果没有空参构造函数,那么就需要每个属性逐个的去赋值,十分的麻烦,而且就算有空参构造,那么赋值的时候,也需要set方法,同样不方便,那么是否有方法可以只赋值想要的属性,不赋值的属性使用默认值,然后创建一个对象

构造者模式创建对象

 引入依赖

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>

对实体类使用注解@Builder

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

import java.util.Set;

@Data
@AllArgsConstructor
@Builder
public class TradeUserSpuOrderBean {

    // 窗口起始时间
    String stt;
    // 窗口结束时间
    String edt;
    // 品牌 ID
    String trademarkId;
    // 品牌名称
    String trademarkName;
    // 一级品类 ID
    String category1Id;
    // 一级品类名称
    String category1Name;
    // 二级品类 ID
    String category2Id;
    // 二级品类名称
    String category2Name;
    // 三级品类 ID
    String category3Id;
    // 三级品类名称
    String category3Name;

    // 订单 ID
    @TransientSink
    Set<String> orderIdSet;

    // sku_id
    @TransientSink
    String skuId;

    // 用户 ID
    String userId;
    // spu_id
    String spuId;
    // spu 名称
    String spuName;
    // 下单次数
    Long orderCount;
    // 下单金额
    Double orderAmount;
    // 时间戳
    Long ts;
}

构造者创建对象

TradeUserSpuOrderBean test = TradeUserSpuOrderBean.builder()
                       				 .skuId(jsonObject.getString("sku_id"))
                        			 .userId(jsonObject.getString("user_id"))
                       				 .orderAmount(jsonObject.getDouble("split_total_amount"))
                       				 .orderIdSet(orderIds)
                       				 .ts(DateFormatUtil.toTs(jsonObject.getString("create_time"), true))
                       				 .build();

可以看到我们只需要对想要赋值的属性赋值即可,不用每个属性都赋值

猜你喜欢

转载自blog.csdn.net/m0_55868614/article/details/129346696