创建对象
前言
构建对象大有内容。
一、用静态工厂方法代替构造器创建对象
对于类而言,为了让客户端获取它自身的一个实例,最传统的方法就是提供 个公有的构造器 还有种方法,也应该在每个程序员的工具箱中占有一席之地,类可以提供一个公有的静态工厂方法,它只是一个返回类的实例的静态方法,本条目中所指的静态工厂方法并不直接对应于设计模式中的工厂方法。
构造器方法:
class People{
String name;
int age;
int weight;
public static People getNameWeightPeople(String name,int age){
People nwp=new People();
nwp.name=name;
nwp.weight=weight;
return nwp;
}
public static People getNameAgePeople(String name,int age){
People nap=new People();
nap.name=name;
nap.age=age;
return nap;
}
public static People getAgePeople(int age){
People ap=new People();
ap.age=age;
return ap;
}
public static People getWeightPeople(int weight){
People wp=new People();
wp.weight=weight;
return wp;
}
}
- 静态工厂方法与构造器不同的第一大优势在于,它们有名称 。
- 静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象。
- 静态工厂方法与构造器不同的第三大优势在子,它们可以返回原返回类型的任何子类型的对象。
- 静态工厂的第四大优势在于,所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。
- 静态工厂的第五大优势在于,方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在。
下面是静态工厂方法 一些惯用名称:
from——类型转换方法,它只有单个参数,返回该类型的一个相对应的实例,例如:
Dated= Date om(i 1stant) ;
of ——聚合方法,带有多个参数,返回该类型的一个实例,把它们合并起来,例如
Set faceCa ds = EnumSet. of (JACK , QUEEN, KING);
valueOf一一比 from of 更烦琐的 种替代方法,例如
Bigintege me = Bigintege .valueOf(Intege .MAX_VALUE);
instance 或者 get Instance -返回的实例是通过方法的(如有)参数来描述
的,但是不能说与参数具有 同样的值,例如
StackWalke luke = StackWalke .getinstance(options);
create 或者 new instance一一才象 instance 或者 getinstance 样,但 create
或者 new instance 能够确保每次调用都返回新的实例 ,例如:
Object newArray = Array.newinstance(classObject, arrayLen);
get Type- get Instance ,但是在工厂方法处于不同的类中的时-候使
Typ 表示工厂方法所返回的对象类型,例如:
FileSto fs = Files.getFileStore(path);
newType一象 newinstance 样,但是在工厂方法处于不同的类中的时候使用,Type 表示工厂方法所返回的对象类型,例如:
BufferedReader br= Files.newBufferedReader(path);
二、遇到多个构造器参数时要考虑使用构建器
构建器模式,我们上次就分析过相关内容。这里不在赘述。
public class User {
private String username;
private String age;
private String gender;
private String hobby;
/**
* 构建器
*/
public static class Builder {
// 必须的参数
private String username;
private String age;
// 可选的参数 可以在这里设置默认值
private String gender = "保密";
private String hobby;
public Builder(String username, String age) {
this.username = username;
this.age = age;
}
public Builder gender(String gender) {
this.gender = gender;
return this;
}
public Builder hobby(String hobby) {
this.hobby = hobby;
return this;
}
public User build() {
return new User(this);
}
}
private User(Builder builder) {
username = builder.username;
age = builder.age;
gender = builder.gender;
hobby = builder.hobby;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age='" + age + '\'' +
", gender='" + gender + '\'' +
", hobby='" + hobby + '\'' +
'}';
}
}
总结
善用构建模式