扎实的java功底系列(Effective java)1

转眼今年大三就结束了,在过一阵子就要面临找找实习,找工作的问题了。找工作之前,先把自己的java功底打好,所以暑假准备静下心来,好好看看书,为将来面试做准备,废话不多说,现在开始。

                                                                                                                                                                                                 所有人都在拼命努力,不只有你受尽委屈。

考虑用静态工厂方法代替构造器

什么是静态工厂方法,在类体里面的、静态的、能够返回这个类的一个实例的方法。比如说:

public static Boolean valueOf(boolean b){
     return b ? Boolean.TRUE : Boolean.FALSE;
}

这是书里面的一个例子,用来判断一个bool型变量的真假。

那么使用静态工厂方法到底有什么好处呢?下面一一列出:

1、静态工厂方法自带名称

package serviceprovider;

public class Car {
    private int price;
    private int length;
    private int height;
    private int width;
    private String color;
    
    private static final Car redCar = new Car("red");
    private static final Car blueCar = new Car("blue");
    private static final Car bestSaleCar = new Car(350000, 3, 2, 2, "blue");
    
    public Car(int price) {
        super();
        this.price = price;
    }

    public Car(int price, int length, int height, int width, String color) {
        super();
        this.price = price;
        this.length = length;
        this.height = height;
        this.width = width;
        this.color = color;
    }

    public Car(String color) {
        super();
        this.color = color;
    }
    
    /**
     * 下面是静态工厂方法
     */
    public static Car getRedCar(){
        return redCar;
    }
    
    public static Car getBlueCar(){
        return blueCar;
    }
    
    /**
     * 获取这个季度卖的最好的车
     * @return
     */
    public static Car getBestSaleCar(){
        return bestSaleCar;
    }
    
}

上面的例子中,假设一个工厂造两种颜色的车,根据体型的大小有不同的价格,那么会出现很多构造器,当参数一多,开发人员就开始迷糊了。而下面的是静态工厂方法,直接用带名字的方法返回一个实例,更加方便。

 

2、不用每次调用的时候都创建一个新的项目

java中对象的创建并不是任意的,因为重复创建对象会降低程序的性能,所以静态工厂方法的出现能够改善这个现象,它使用已经构建好的实例或者将构建好的实例缓冲起来,进行重复利用。

例如上面的例子,我要获取这个季度销售最好的汽车,那么我只要调用一个方法就可以实现,并不需要每次都重新创建对象。

 

3、它可以返回原返回类型的任何子类型对象

暂时还看不懂服务提供者框架。

 

4、创建参数化类型实例的时候能够使代码变得简单

类型推导,例如下面的这个例子,

//这样写很长
    Map<String, List<String>> m = new HashMap<String, List<String>>();

    //现在可以使用
    Map<String, List<String>> m = HashMap.newInstance();

在java1.8里面,HashMap已经没有newInstance这个静态方法了,从java 1.7开始,就会根据上下文自动进行类型推断,因此可以这样写:

Map<String, List<String>> m = new HashMap<>();

 

 

 

 

 

 

 

 

 

 

 

 


posted @ 2015-07-11 10:07  loutao  阅读(310)  评论(0)    收藏  举报