本博客,教给你如何避免一些java错误,如何处理一些java错误。
第一章、创建和销毁对象:
- 第1条 考虑用静态工厂方式代替构造器:(?)
1> 与构造器的不同的优势所在:
(1)它们有名称。
(2)不必在每次调用它们时都创建一个新对象。
(3)它们可以返回类型的任何子类型的对象。 - 第2条 遇到多个构造器参数时考虑用构建器:
方法:把需要用的参数包装在这个类的一个成员类中,创一个给它们赋值的方法,但返回的是本类对象,最后一个方法是传入此对象,返回的是外部类对象。
优势:可以有多个可变参数。
范例:
/**
Builder模式:当构造器需要传入多个参数,且并不确定传几个时,可以使用Builder模式:
1.范例:模拟食品中营养成分构建
*/
public class NutritionFacts{ //营养类,需要一个可以传入多个参数的构造器
//1私有的静态属性颜色,大小等
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
public int getfat(){
return fat;
}
private final int sodium;
private final int carbohydrate;
//2静态的成员类
public static class Builder{
/*必须用到的参数
*/
private final int servingSize;
private final int servings;
/*可选的参数,并赋值初始化(注:不能用final了)
*/
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
//Builder的构造器
public Builder(int servingSize,int servings ){
this.servingSize = servingSize;
this.servings =servings;
}
//其他参数通过方法来一一获得
public Builder calories(int val){
this.calories = val;
return this;
}
public Builder fat(int val){
this.fat = val;
return this;
}
public Builder carbohydrate(int val){
this.carbohydrate = val;
return this;
}
public Builder sodium(int val){
this.sodium = val;
return this;
}
//实例一个NutritionFacts对象,参数传入builder
public NutritionFacts build(){
return new NutritionFacts(this);
}
}
//外部类的构造器,参数是builder类型
private NutritionFacts(Builder builder){
//将外部类中的参数赋值,将builder中的参数赋给它
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
carbohydrate = builder.carbohydrate;
sodium = builder.sodium;
}
}
//客户端测试:
public class TestFactory
{
public static void main(String[] args)
{
/*创建NutritionFacts对象,用到静态类Builder,且里面有必传的两个参数,其他参数可通过方法任意选择是否传入,且最后一定要.build方法。
.builder的作用就是又返回到生成一个NutritionFacts对象,
*/
NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).calories(100).sodium(35).carbohydrate(27).fat(16).build();
System.out.println(cocaCola.getfat());
}
}