本文已参与「新人创作礼」活动,一起开启掘金创作之路。
传统写法
首先,我们有一个Param对象,他有9个参数,当我们new出它的时候通常会有两种写法:
public class BuilderTest {
public static void main(String[] args) {
//写法一
Param param = new Param("1", "2", "3", "4", "5", "6", "7", "8", "9");
//写法二
Param param1 = new Param();
param1.setParam1("1");
param1.setParam2("2");
param1.setParam3("3");
param1.setParam4("4");
param1.setParam5("5");
param1.setParam6("6");
param1.setParam7("7");
param1.setParam8("8");
param1.setParam9("9");
}
}
class Param {
private String param1;
private String param2;
private String param3;
private String param4;
private String param5;
private String param6;
private String param7;
private String param8;
private String param9;
public Param() {
}
public Param(String param1, String param2, String param3, String param4,
String param5, String param6, String param7, String param8,
String param9) {
this.param1 = param1;
this.param2 = param2;
this.param3 = param3;
this.param4 = param4;
this.param5 = param5;
this.param6 = param6;
this.param7 = param7;
this.param8 = param8;
this.param9 = param9;
}
......//这里是get和set方法
}
你写代码的时候是不是觉得这样写很舒服,甚至都不用动脑子,那是因为你明确了解每个参数的意义,如果换个人来看,首先构造方法就9个参数,就已经劝退一拨人了,同时也不明确,哪几个参数是最重要的,必须要给的,这就很让人无语。
优化写法
使用Builder的模式是不是感觉清晰了很多,下面这种格式就明确的可以看出,param1和param2是必须要的参数,其余参数可选择的设置。
public class BuilderTest {
public static void main(String[] args) {
Param param =
new Param.ParamBuilder("1", "2")
.param3("3")
.param4("4")
.build();
System.out.println(param.getParam1());
}
}
class Param {
private String param1;
private String param2;
private String param3;
private String param4;
private String param5;
private String param6;
private String param7;
private String param8;
private String param9;
/**
* 注意这里,构造器私有化
*/
private Param(ParamBuilder paramBuilder) {
this.param1 = paramBuilder.param1;
this.param2 = paramBuilder.param2;
this.param3 = paramBuilder.param3;
this.param4 = paramBuilder.param4;
this.param5 = paramBuilder.param5;
this.param6 = paramBuilder.param6;
this.param7 = paramBuilder.param7;
this.param8 = paramBuilder.param8;
this.param9 = paramBuilder.param9;
}
/**
* 一个静态Builder类
*/
public static class ParamBuilder {
private String param1;
private String param2;
private String param3;
private String param4;
private String param5;
private String param6;
private String param7;
private String param8;
private String param9;
/**
* 将必须要的参数放入构造函数
*/
public ParamBuilder(String param1, String param2) {
this.param1 = param1;
this.param2 = param2;
}
public ParamBuilder param3(String param3) {
this.param3 = param3;
return this;
}
public ParamBuilder param4(String param4) {
this.param4 = param4;
return this;
}
public ParamBuilder param5(String param5) {
this.param5 = param5;
return this;
}
public ParamBuilder param6(String param6) {
this.param6 = param6;
return this;
}
public ParamBuilder param7(String param7) {
this.param7 = param7;
return this;
}
public ParamBuilder param8(String param8) {
this.param8 = param8;
return this;
}
public ParamBuilder param9(String param9) {
this.param9 = param9;
return this;
}
public Param build() {
return new Param(this);
}
}
public String getParam1() {
return param1;
}
public String getParam2() {
return param2;
}
public String getParam3() {
return param3;
}
public String getParam4() {
return param4;
}
public String getParam5() {
return param5;
}
public String getParam6() {
return param6;
}
public String getParam7() {
return param7;
}
public String getParam8() {
return param8;
}
public String getParam9() {
return param9;
}
@Override
public String toString() {
return "Param{" +
"param1='" + param1 + '\'' +
", param2='" + param2 + '\'' +
", param3='" + param3 + '\'' +
", param4='" + param4 + '\'' +
", param5='" + param5 + '\'' +
", param6='" + param6 + '\'' +
", param7='" + param7 + '\'' +
", param8='" + param8 + '\'' +
", param9='" + param9 + '\'' +
'}';
}
}
是不是有的童鞋发现 好像在哪见过这种写代码的方式?
没错,spring相关的东西里面随处可见。
下面就是我从Spring Security里面找的一个,相信不少人都用过吧。
Lombok写法
当然平时写代码不可能这么瓜皮,手撸是不存在的,lombok这玩意改用还是得用上,看:
public class BuilderTest2 {
public static void main(String[] args) {
Param2 build = new Param2.Param2Builder()
.param1("1")
.param2("2").build();
System.out.println(build.getParam1());
}
}
@Data
@Builder
class Param2{
private String param1;
private String param2;
private String param3;
private String param4;
private String param5;
private String param6;
private String param7;
private String param8;
private String param9;
}
ps:虽然方便,但是突出重要参数的功能就没了,看心情选呗=。=