在新建对象时,若需要对大量可选参数进行赋值,最常见的做法是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外部类对象才能访问内部类。
而不能直接外部类.内部类 这样访问