本文共 1878 字,大约阅读时间需要 6 分钟。
对于一个类而言,如果要想获取它的一个实例,最基本的方法是通过默认公有的构造函数去new一个,例如:
Demo demo = new Demo();
如果想在new的时候给Demo类的两个属性赋值,就需要使用额外的构造函数,例如:
public Demo(String a, String b) {
this.a = a;
this.b = b;
}
Demo demo = new Demo("a","b");
但是,如果这个Demo类有很N个属性,例如6个(也可以更多),现在也想在new的时候给Demo类的6个属性赋值,你还会使用多参数的构造函数new一个吗?
笔者认为大多数程序员都不会选择这么做!了解一下为什么不这么做的原因。对属性名称正确命名的情况还好,在使用这种多参数构造函数的时候,从参数名称上还知道给应该给哪个参数赋什么值,但是你需要记住这些参数的顺序及位置,如果参数很多,你还能准确无误的赋值吗?有些时候有的属性需要赋值,有的不需要,难道你有的不赋值,有的赋值?如果你使用别人jar里提供的Demo类,但是你看不到源代码,也没有javadoc文档,你是不是更无从下手了?还有,这样new一个对象是不是很累?
可能有的程序员会说,这很简单,先使用默认公有的构造函数new一个实例,然后使用属性的setter方法给每个属性赋值,完美解决!
相信很多人会同意这样的做法,但是,这样真的不是最优解。类的属性提供setter方法后,你可以在任何地方去set,这样会导致给属性赋值的代码分散在各个角落,进而导致连自己都不知道在什么地方“又重新”赋了值,不容易管理。
针对这种多参数的方法,无论是构造函数,还是普通的函数,有节操的做法是使用Builder模式,有兴趣的可以自行科普一下Builder模式,还是同样的代码,看一下Builder模式是如何解决这个问题的。
public class Demo {
private String firstName;
private String lastName;
private int age;
private Demo(Builder builder) {
firstName = builder.firstName;
lastName = builder.lastName;
age = builder.age;
}
public static Builder newBuilder() {
return new Builder();
}
public static final class Builder {
private String firstName;
private String lastName;
private int age;
private Builder() {
}
public Builder withFirstName(String val) {
firstName = val;
return this;
}
public Builder withLastName(String val) {
lastName = val;
return this;
}
public Builder withAge(int val) {
age = val;
return this;
}
public Demo build() {
return new Demo(this);
}
}
public static void main(String[] args) {
Demo demo = Demo.newBuilder()
.withFirstName("aaa")
.withLastName("bbb")
.withAge(8)
.build();
}
}
上面的代码为了节省空间没有写getter方法,getter方式是需要的。在main方法可以看到使用Builder模式new一个实例,代码很清晰,要给哪个属性赋值就给哪个属性赋值,属性再多也不怕,再也不用牢记哪个位置对应哪个属性了,而且这里的赋值都在一个地方,不分散、好管理。
上面说的是如何有节操的创建一个类的实例,同样,对类中的普通方法也很适用,即如果类的方法参数超过了三个,那就需要将这些参数抽象成一个类,并且类中使用Builder模式,然后使用这个类代替原来的参数,在实际方法调用的时候使用Builder模式构造这个参数类。
代码首先是写给人看的,其次才是给机器运行的,追求有节操的代码,你会收获更多!共勉!
转载地址:http://aniql.baihongyu.com/