一般来说,最好能重用对象而不是每次需要就创建一个功能相同的对象。
String s = new String("aaaaaa");
以上是一个极端的例子,其实“aaaaaa”本身就是个对象没必要在为其封装一遍:
String s = "aaaaaa";
对于有静态工厂方法和构造器的不可变类,一般优先采用静态工厂。
除了重用不可变的对象之外,也可以重用那些已知不会被修改的可变对象。
public class Person {
private final Date 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实例。继续看第2例:
class Person {
private final Date 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, 1, 0, 0, 0);
BOOM_END = gmtCal.getTime();
}
public boolean isBabyBoomer() {
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
}
}
这种 Calendar,TimeZone,Date 只实例化一次,而不是每次调用isBabyBoomer时创建对象。
最后一种java 中有种叫自动封装的东西
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
以上程序其实只是打错一个字符,但是实际速度确是天差地别,sum 声明的类型为Long而不是long 意味着程序构造了大约231的多余Long实例。
以上结论很明显:要优先使用基本类型而不是封装基本类型,要当心无意识的自动封装。