使用Builder模式创建复杂可选参数对象

本文探讨了在面对大量可选参数时,如何避免JavaBeans模式的繁琐和构造方法的臃肿。通过引入Builder模式,可以更优雅地创建复杂可选参数的对象。Builder模式通过一个内部静态类持有所有属性,并提供setter方法,最终通过build方法构建对象,提升了代码的可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在新建对象时,若需要对大量可选参数进行赋值,最常见的做法是JavaBeans模式,即调用一个无参构造方法创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数

这种模式需要的代码语句繁琐,而且这种做法阻止了把类做成不可变的可能(不可变的类没有set方法,且创建之后没有任何可以更改属性的方法)。更加简洁的一种方式是通过多个构造方法去新建对象。

但是这样,就会有多个不同的构造方法,当参数越来越多时,这种方式就会使类的结构变得臃肿,难以维护,在使用时也需要去逐个理解每种构造方法的参数意义

有没有一种更好的创建大量可选参数对象的方式?答案是Builder模式。

具体思路,在bean里面再建立一个私有静态类,拥有bean的所有的属性,
然后里面有所有属性的set方法,并返回this 这个静态类对象本身。
最后有一个build方法,这里调用bean的私有构造方法,将私有静态类对象的this传进去,最后一一赋值。

使用的时候,就

  ReceiveListQueryDTO receiveListQueryDTO=new ReceiveListQueryDTO.Builder()
                    .isAll(Boolean.TRUE)
                    .itemCode("asdasd")
                    .page(1)
                    .pageSize(123)
                    .build();

这样使用 ,灵活了很多。

package com.souche.sfs.server.model.dto;


import lombok.Data;
import lombok.ToString;

/**
 * @ClassName receiveListQueryDTO
 * @Author laixiaoxing
 * @Date 2019/4/29 下午2:03
 * @Description 应收列表收 查询参数
 * @Version 1.0
 */
@Data
@ToString
public class ReceiveListQueryDTO {

    /**
     * 关键字(订单中心编号)
     */
    private String orderCode;

    /**
     * 车架号 vin码
     */
    private String Vin;

    /**
     * 销售渠道编码
     */
    private String saleChannelCode;

    /**
     * 订单类型编码
     */
    private String orderTypeCode;

    /**
     * 款项编码
     */
    private String itemCode;

    /**
     * 匹配状态
     */
    private String matchStatus;

    /**
     * 实收开始日期
     */
    private String startTradeDate;

    /**
     * 实收结束日期
     */
    private String endTradeDate;

    /**
     * 测试数据
     */
    private Boolean isTest;

    /**
     * 产品线
     */
    private String productLineCode;
    /**
     * 是否 存量数据
     */
    private Boolean isAll;

    /**
     * 页码
     */
    private Integer page;

    /**
     * 每页条数
     */
    private Integer pageSize;


    private ReceiveListQueryDTO(Builder builder) {
        this.orderCode = builder.orderCode;
        this.Vin = builder.Vin;
        this.saleChannelCode = builder.saleChannelCode;
        this.orderTypeCode = builder.orderTypeCode;
        this.itemCode = builder.itemCode;
        this.matchStatus = builder.matchStatus;
        this.startTradeDate = builder.startTradeDate;
        this.endTradeDate = builder.endTradeDate;
        this.isTest = builder.isTest;
        this.productLineCode = builder.productLineCode;
        this.isAll = builder.isAll;
        this.page = builder.page;
        this.pageSize = builder.pageSize;
    }


    public  static class Builder {

        private String orderCode;

        public Builder orderCode(String orderCode) {
            this.orderCode = orderCode;
            return this;
        }

        private String Vin;

        public Builder Vin(String vin) {
            this.Vin = Vin;
            return this;
        }

        private String saleChannelCode;

        public Builder saleChannelCode(String saleChannelCode) {
            this.saleChannelCode = saleChannelCode;
            return this;
        }

        private String orderTypeCode;

        public Builder orderTypeCode(String orderTypeCode) {
            this.orderTypeCode = orderTypeCode;
            return this;
        }

        private String itemCode;

        public Builder itemCode(String itemCode) {
            this.itemCode = itemCode;
            return this;
        }

        private String matchStatus;

        public Builder matchStatus(String matchStatus) {
            this.matchStatus = matchStatus;
            return this;
        }

        private String startTradeDate;

        public Builder startTradeDate(String startTradeDate) {
            this.startTradeDate = startTradeDate;
            return this;
        }

        private String endTradeDate;

        public Builder endTradeDate(String endTradeDate) {
            this.endTradeDate = endTradeDate;
            return this;
        }


        private Boolean isTest;

        public Builder isTest(Boolean isTest) {
            this.isTest = isTest;
            return this;
        }

        private String productLineCode;

        public Builder productLineCode(String productLineCode) {
            this.productLineCode = productLineCode;
            return this;
        }

        private Boolean isAll;

        public Builder isAll(Boolean isAll) {
            this.isAll = isAll;
            return this;
        }

        private Integer page;


        public Builder page(Integer page) {
            this.page = page;
            return this;
        }


        private Integer pageSize;

        public Builder pageSize(Integer pageSize) {
            this.pageSize = pageSize;
            return this;
        }

        public ReceiveListQueryDTO build() {
            return new ReceiveListQueryDTO(this);
        }
    }

    public static void main(String[] args) {
          ReceiveListQueryDTO receiveListQueryDTO=new ReceiveListQueryDTO.Builder()
                    .isAll(Boolean.TRUE)
                    .itemCode("asdasd")
                    .page(1)
                    .pageSize(123)
                    .build();
    }

}

public  static class Builder 必须是公共静态内部类,因为不是public 外部就无法访问
,不是static的话,就得先new外部类对象才能访问内部类。
而不能直接外部类.内部类 这样访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值