避免创建重复的对象

避免创建重复的对象:

public class Person { private final Date birthDate; //Other fields omitted 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,10,0,0,0); Date boomEnd = gmtCal.getTime(); return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0 ; } public static void main(String[] args) { ; System.out.println(new Person(new Date()).isBabyBoomer()); } }

 

isBabyBoomer每次被调用的时候,都会创建一个新的Calendar、一个新的TimeZone和两个新的Date实例,这是不必要的。下面的版本用一个静态的初始化器(initalizer),避免上面例子的低效率:

 

 

public class Person {

 

private final Date birthDate;

//Other fields omitted

public Person(Date birthDate){

this.birthDate = birthDate;

}

private static final Date BOOM_START ;

private static final Date BOOM_END;

 

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,10,0,0,0);

BOOM_END = gmtCal.getTime();

}

 

public boolean isBabyBoomer1(){

return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;

}

 

}

 

改进版本的Person类仅在初始化的时候创建Calendar,TimeZone和Date实例一次,而不是每次isBabyBoomer被调用的时候创建它们。

 

 

如果isBabyBoomer方法永远不会被调用,那么Person类的改进版本就没有必要去初始化BOOM_START和BOOM_END域。通过迟缓初始化(Lazy initalizing)将这些域的初始化推迟到isBabyBoomer方法第一次被调用的时候,则有可能消除这些不必要的初始化工作,但不推荐这样做。如迟缓初始化(Lazy initialization)中常见的情况一样,这样做会使方法的实现更加复杂,从而无法获得性能上的显著提高。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值