我们在书写一个类的时候,常常会出现一个类的属性有很多,那么就有可能存在这种情况,有一些属性是必须存在的,但是有一些属性是非必须的,根据实际业务来确定。那么这种情况我们该怎么处理类的构造函数呢?总不可能为每一种情况都来写一个构造函数吧?这样代码太冗余了,在new对象的时候也容易出错。
我们可以通过使用静态内部类来比较优雅的处理这个问题。
1.创建一个合适的类:Student
public class Student {
private int age;//年龄
private String name;//姓名
private int id;//身份证
private String address;//住址
private String sex;//性别
private String phnum;//电话号码
public Student() { }
}
其中年龄和姓名是必须的,其他属性是非必须的
2.Student有参的构造函数通过静态内部类Builder来处理
为了减少代码,这里我将Student类属性的get和set方法省略了,只留了主体代码,如下:
public class Student {
private int age;//年龄
private String name;//姓名
private int id;//身份证
private String address;//住址
private String sex;//性别
private String phnum;//电话号码
public Student() {
}
public Student(Bulider bulider){
this.age = bulider.age;
this.name = bulider.name;
this.id = bulider.id;
this.address = bulider.address;
this.sex = bulider.sex;
this.phnum = bulider.phnum;
}
//通过这个静态内部类来构造Student对象
public static class Bulider{
//学生类必须有的属性
private int age;
private String name;
//学生类非必须有的属性
private int id = 0;//身份证
private String address = null;//住址
private String sex = null;//性别
private String phnum = null;//电话号码
//通过Student类必须有的属性来写Builder的构造函数
public Bulider(int age, String name) {
this.age = age;
this.name = name;
}
//通过方法来给Student类的属性赋值,注意,方法要返回Builder本身,方便链式调用
public Bulider id(int val){
this.id =val;
return this;
}
public Bulider address(String val){
this.address =val;
return this;
}
public Bulider sex(String val){
this.sex =val;
return this;
}
public Bulider phnum(String val){
this.phnum =val;
return this;
}
public Student build(){
return new Student(this);
}
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", id=" + id +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", phnum='" + phnum + '\'' +
'}';
}
}
3. 测试
public class TestBulider {
public static void main(String[] args) {
Student student = new Student.Bulider(18,“张三”).address(“江西上饶”).id(123456).sex(“男”).build();
System.out.println(student);
}
}