一、多个构造器的缺点
我们有时候可能会遇到编写大量构造器的方法
<span style="font-size:18px;">public class Person {
private final String name;
private final String sex;
private final int age;
private final int weight;
public Person(String name){
this(name,"男");
}
public Person(String name,String sex){
this(name,sex,12);
}
public Person(String name,String sex,int age){
this(name,sex,age,120);
}
public Person(String name,String sex,int age,int weight){
this.name = name;
this.sex = sex;
this.age = age;
this.weight = weight;
}
}
</span>
缺点:但是当构造方法更多的时候,往往令我们需要些大量的代码。并且编写出的代码很难令人理解。二、采取新方法:JavaBean。javaBean的优点和缺点
什么叫做javaBean:
方法中只有set()和get()用来获取和修改成员变量的类
示例:
public class Person {
private String name;
private String sex;
private int age;
private int weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
Person person = new Person();
person.setName("name");
person.setSex("男");
person.setAge(18);
缺点:多线程的情况下无法保证成员变量的一致性。需要精力去保证线程安全。
三、采取第二种方法:Builder方法 Builder方法的优缺点
什么叫做Builder:比如说你是老板,Builder就是你的秘书。你的下属要将东西提交给你,必须先提交给你的秘书,你的秘书,先整理下属传递过来的文件(哪些,有哪些没有),然后再审核(哪些数据是正确的,哪些数据是错误的)
最后,再将文件传递给你。
使用情形:1、大量可选择填写的成员变量
示例:
public class Person {
//第一步:创建你需要的文件的声明,final 表示文件只能被提交一次,不能修改的
private final String name;
private final String sex;
private final int age;
private final int weight;
//第四步:创建接收秘书文件的构造方法(私有的),文件必须是由秘书传递来的。
private Person(Builder builder){
this.name = builder.name;
this.sex = builder.sex;
this.age = builder.age;
this.weight = builder.weight;
}
//第二步:创建Builder,你的秘书
public static class Builder{
//最重要的文件,必须上交
private final String name;
//下面都不是中要的文件,可填可不填(一般都提供一个默认值)
private String sex;
private int age;
private int weight;
//必须上交的文件,要放在构造方法中
public Builder(String name){
this.name = name;
}
//创建上交数据的方法,记住上交完之后,秘书是还在的(返回秘书本身)
public Builder setSex(String sex) {
this.sex = sex;
return this;
}
public Builder setAge(int age) {
this.age = age;
return this;
}
public Builder setWeight(int weight) {
this.weight = weight;
return this;
}
//第五步:秘书检查完成之后,将文件提交给老板
public Person build(){
return new Person(this);
}
}
}
使用:
public static void main(String[]args){
Person person = new Person.Builder("gogo")
.setAge(10)
.setSex("男")
.setWeight(120)
.build();
}
优点:保持良好的阅读性。又有良好的安全性、并且可以在Builder接收参数的时候判断参数是否正确。
缺点:代码量比较大