一、常用解决方法(不能很好的扩展到大量的可选参数)
1、静态工厂类
缺点:a、类如果不含有共有的或者受保护的构造器,就不能被子类化。
b、他们与其他的静态方法实际上没有任何的区别。
2、使用构造器
a、重叠构造器:该方法可行,但是当参数很多的时候,我们会发现客户端代码很难编写,需要传一些不需要的字段。
b、set方法:这种模式弥补了重叠构造器的不足,虽然这种方式,阅读起来也比较容易,但这种方法有明显的缺点。
1、这个构造的过程被分到了几个调节中,在构造的过程中可能出现不一致的状态,类无法仅仅通过检验构造器参数的有效性保持一致性,视图使用不一致状态的对象,将会导致失败。
二、构建器的使用
我们可以让类实例化的时候构造函数包含必填的参数,然后选填的参数则可以不必要自己来实例化
举例:
package com.shuang.javabean;
/**
*
* @author shuang
*
*/
public class UserInfo {
/**
* 用户名
*/
private final String userName;
/**
* 密码
*/
private final String password;
/**
* 年龄
*/
private final int age;
/**
* 手机号码
*/
private final String phone;
/**
* 体重
*/
private final int weight;
/**
* 脂肪含量
*/
private final int fat;
public String toString() {
return "UserInfo [userName=" + userName + ", password=" + password + ", age=" + age + ", phone=" + phone
+ ", weight=" + weight + ", fat=" + fat + "]";
}
/**
* 内部构造器
*
*/
public static class Builder{
//必要的参数
private String userName;
private String password;
/**
* 不必要的参数
*/
private int weight = 0;
private int age = 0;
private int fat = 0;
private String phone = null;
public Builder(String userName ,String password) {
this.userName = userName;
this.password = password;
}
public Builder weight(int weight){
this.weight = weight;
return this;
}
public Builder age(int age){
this.age = age;
return this;
}
public Builder fat(int fat){
this.fat = fat;
return this;
}
public UserInfo build(){
return new UserInfo(this);
}
}
private UserInfo(Builder builder){
userName = builder.userName;
password = builder.password;
phone = builder.phone;
weight = builder.weight;
age = builder.age;
fat = builder.fat;
}
}
测试代码:
package com.shuang.test;
import com.shuang.javabean.UserInfo;
public class Test {
public static void main(String[] args) {
UserInfo userInfo = new UserInfo.Builder("张三","123456").build();
System.out.println(userInfo);
UserInfo userInfo1 = new UserInfo.Builder("李四","654321").age(18).build();
System.out.println(userInfo1);
}
}
优点:容易编写,易于阅读参数可选,可以像构造器一样对参数进行校验等等