讨论演进
1.多个构造器,构造器的参数列表越来越长
缺点:客户端代码很难编写,并且比较难以阅读
2.javaBeans模式
做法:使用无参构造器来创建对象,然后使用setter方法来设置每个必要参数。利于可读性
缺点:将一个构造过程分到几个调用中,在构造过程中JavaBean可能处于不一致状态
3.Builder模式
1和2的综合。
参考代码(来源于effective java中文版第11页):Builder类为NutritionFacts类的静态成员类
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
public static class Builder {
//
private final int servingSize;
private final int servings;
private int calories = 0;
private int fat = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
calories = val;
return this;
}
public Builder fat(int val) {
fat = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
}
}
备注:
Java 类中的静态成员类和非静态成员类的访问方式
非静态成员类:
public
class
TestNonstaticMember {
class
A{
public
void
setA(){ }
}
public
static
void
main(String[] args){
TestNonstaticMember
nonStatic=
new
TestNonstaticMember
();
TestNonstaticMember.
A t=
nonStatic
.
new
A();
t.setA();
}
}
静态成员类:
调用静态内部类的非静态方法:
public
class
TestStaticMember
{
static
class
A{
public
void
setA(){ }
}
}
public
class
Test2 {
public
static
void
main(String[] args){
TestStaticMember
.A a=
new
TestStaticMember
.A();
a.setA();
}
}
调用静态内部类的静态方法:
public
class
TestStaticMember
{
static
class
A{
static
public
void
setA(){ }
}
}
public
class
Test2 {
public
static
void
main(String[] args){
TestStaticMember
.A.setA();
}
}
总结:
内部类和静态修饰符static
1)首先,用内部类是因为内部类与所在外部类有一定的关系,通常只有该外部类打算调用此内部类。
所以没有必要专门用一个Java文件存放这个类。
2)静态都是用来修饰类的内部成员的。
比如静态方法,静态成员变量,静态常量。
它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。