effective java读书笔记(一)

1.  使用静态工厂方法替代构造器

优势:

1. 静态方法有名字,可以清楚的表示不同静态工程方法的构造方式。

2. 不必在每次调用的时候都创建一个新对象,可以提升性能。

3. 可以返回原返回类型的任何子类型对象。

4. 在创建参数化类型实例的时候,它们使得代码变得更加简洁。

缺点:

1. 类如果不含有公有的或者受保护的构造器,就不能被子类化。

2. 它们与其他静态方法实际上没有任何区别。它们没有像构造器一样在API文档中明确标识出来,因此对于提供了静态工厂方法而不是构造器的类来说,无法查明如何实例化一个类。

2.  遇到多个构造器参数时要考虑用构建器

Builder 模式

public class NutritionFacts {

    private final int servingSize;

    private final int servings;

    private final int calories;

    private final int fat;

    private final int sodium;

    private final int carbohydrate;

   

    public static class Builder{

        //必选参数

        private final int servingSize;

        private final int servings;

       

        //可选参数

        private int calories = 0;

        private int fat = 0;

        private int carbohydrate = 0;

        private int sodium=0;

        public Builder(int servingSize, int servings) {

            super();

            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 Builder carbohydrate(int val){

            carbohydrate = val;

            return this;

        }

        public Builder sodium(int val){

            sodium = val;

            return this;

        }

       

        public NutritionFacts build(){

            return new NutritionFacts(this);

        }

    }

   

    public NutritionFacts(Builder builder) {

        this.servingSize = builder.servingSize;

        this.servings = builder.servings;

        this.calories = builder.calories;

        this.fat = builder.fat;

        this.carbohydrate = builder.carbohydrate;

        this.sodium = builder.sodium;

    }

   

    //客户端

    public static void main(String[] args) {

        NutritionFacts nutritionFacts= new NutritionFacts.Builder(240, 8).calories(100).sodium(30).build();

        //……

    }

}

 

3.  用私有构造器或者枚举类型强化Singleton属性

单例模式的5种实现(推荐使用后面三种):

public class Singleton1 {

    private final static Singleton1 INSTANCE = new Singleton1();

    private Singleton1(){}

    public static Singleton1 getInstance(){

        return INSTANCE;

    }

}

 ================================================================

public class Singleton2 {

    private final static Singleton2 INSTANCE;

    static{

        INSTANCE = new Singleton2();

    }

    private Singleton2(){}

    public static Singleton2getInstance(){

        return INSTANCE;

    }

}

 ================================================================

public class Singleton3 {

    public static volatile Singleton3 instance;

    private Singleton3() {

    }

    public static Singleton3getInstance() {

        if (instance == null) {

            if (instance == null) {

                synchronized (Singleton3.class) {

                    instance = new Singleton3();

                }

            }

        }

        return instance;

    }

}

================================================================ 

public enum Singleton4 {

    INSTANCE;

}

================================================================ 

public class Singleton5 {

    private Singleton5(){}

    private static class SingletonInstance{

        private final static Singleton5 INSTANCE = new Singleton5();

    }

    public static Singleton5getInstance(){

        return SingletonInstance.INSTANCE;

    }

}

4.  通过私有构造器强化不可实例化的能力

工具类没有实例化的必要,故其可以通过私有构造器来禁止自己被实例化。

猜你喜欢

转载自blog.csdn.net/ccccc_sssss/article/details/80978121