您的位置:首页 > 其它

创建和销毁对象——避免创建不必要的对象——重用那些已知不会被修改的可变对象。

2015-10-22 16:36 357 查看
除了重用不可变的对象之外,也可以重用那些已知不会被修改的可变对象。

下面是一个比较微妙、也比较常见的反面例子,其中涉及可变的Date对象,它们的值一旦计算出来之后就不再变化。

这个类建立了一个模型:其中有一个人,并有一isBabyBoomer方法,用来检验这个人是否生育1946-1964(生育高峰期)

public class Person {

private final Date birthDate;

[code]public Person(Date birthDate){
    this.birthDate = birthDate;
}

// Don't do this
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;

[code]private static final Date BOOM_START;
private static final Date BOOM_END;

public Person(Date birthDate){
    this.birthDate = birthDate;
}

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 boolean isBabyBoomer(){
    return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
}


}

[code]改进后的Person类只在初始化的时候创建Calendar、TimeZone和Date实例一次,而不是在每次调用isBabyBoomer()的时候的欧创建这些实例。
如果isBabyBoomer()方法被频繁地调用,这种方法将会显著地提高性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: