Effective Java

避免创建不必要的对象

2017-03-16  本文已影响36人  大海孤了岛

一般来说,最好能重用对象而不是每次需要的时候就创建一个相同的对象。如果对象是不可变的,它就始终可以被重用。

例子:我们创建一个类,用来检验一个人是否为生育高峰期出生的小孩,即检验这一个是否在1946-1964年期间出生的

public class Person {

    private final Date birthDate;
    //传入出生日期
    public Person(Date birthDate){
        this.birthDate = birthDate;
    }
    //检验是否处于高峰生育期
    public boolean isBabyBoomer(){
        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0,0,0);
        Date boomStart = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0,0,0);
        Date boomEnd = gmtCal.getTime();
        return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;
    }
}

我们可以看到,每次调用isBabyBoomer时,都会新建一个Calendar,一个TimeZone和两个Date实例,这种显示是效率底下,且没有必要的。

使用静态的初始化器来实例化不可变的对象。
public class Person {

    private final Date birthDate;
    //定义不可变的对象
    private static final Date BOOM_START;
    private static final Date BOOM_END;
    //使用static方法块,创建不可变对象
    static {
        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0,0,0);
        BOOM_START = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0,0,0);
        BOOM_END = gmtCal.getTime();
    }
    
    //传入出生日期
    public Person(Date birthDate){
        this.birthDate = birthDate;
    }
    //检验是否处于高峰生育期
    public boolean isBabyBoomer(){
        return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
    }
}

改进后的Person类只会在初始化的时候创建Calendar,TimeZone和Date实例,而不是每次调用isBabyBoomer的时候都去创建这些实例。

上一篇 下一篇

猜你喜欢

热点阅读