一般来说,最好能重用对象而不是每次需要的时候就创建一个相同的对象。如果对象是不可变的,它就始终可以被重用。
例子:我们创建一个类,用来检验一个人是否为生育高峰期出生的小孩,即检验这一个是否在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的时候都去创建这些实例。
网友评论