首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

避免创造重复的对象

2012-12-20 
避免创建重复的对象避免创建重复的对象:public class Person {private final Date birthDate//Other fiel

避免创建重复的对象

避免创建重复的对象:

public class Person {private final Date birthDate;//Other fields omittedpublic Person(Date birthDate){this.birthDate = birthDate;}//Don't do thispublic 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)中常见的情况一样,这样做会使方法的实现更加复杂,从而无法获得性能上的显著提高。

?

?

热点排行