Effective java参透

    • 第一章创建和销毁对象

本博客,教给你如何避免一些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());


    }
}

你可能感兴趣的:(java,对象,博客,Class)