避免创建重复的对象

重复使用同一个对象,而不是每次需要时就创建一个功能上等价的对象

String s = new String("silly");

每次执行的时候创建一个新的String实例,但没有一个是真正需要的的,如果在for中将有很多对象被创建出来

String s ="silly"只创建一个对象

构造函数每次调用时总是创建一个新的实例,而静态工厂方法不要求这样做

public class Person {

private final Date birthData;

public Person(Date birthDate) {

this.birthData = birthDate;

}

// 每次被调用是Calendar、TimeZone都要创建一次,date2次,

// 所以不要用这个方法

public boolean isBabyBoorer() {

Calendar gmtCalendar = Calendar

.getInstance(TimeZone.getTimeZone("GMT"));

gmtCalendar.set(1946, Calendar.JANUARY, 1, 0, 0, 0);

Date boomStart = gmtCalendar.getTime();

gmtCalendar.set(1965, Calendar.JANUARY, 1, 0, 0, 0);

Date boomEnd = gmtCalendar.getTime();

return birthData.compareTo(boomStart) >= 0

&& birthData.compareTo(boomEnd) < 0;

}

}

------------------------------------------------------------------------------------------------

/**

* 在初始化时创建一次Calendar、TimeZone都要创建一次,date2次,

* ,而不是每次调用时创建,提高性能

*

* @author dzl

*

*/

class Person2 {

private final Date birthData;

public Person2(Date birthDate) {

this.birthData = birthDate;

}

private static final Date BOOM_START;

private static final Date BOOM_END;

static {

Calendar gmtCalendar = Calendar

.getInstance(TimeZone.getTimeZone("GMT"));

gmtCalendar.set(1946, Calendar.JANUARY, 1, 0, 0, 0);

BOOM_START = gmtCalendar.getTime();

gmtCalendar.set(1965, Calendar.JANUARY, 1, 0, 0, 0);

BOOM_END = gmtCalendar.getTime();

}

public boolean isBabyBoorer() {

return birthData.compareTo(BOOM_START) >= 0

&& birthData.compareTo(BOOM_END) < 0;

}

}

当然,小对象的构造和回收是非常廉价的,特别是现代的JVM强大的功能超过自己维护对象池的性能。在提倡使用保护性拷贝的场合,重用一个对象招致的代价大于重复创建对象而招致的代价。所以如何使用要斟酌。

你可能感兴趣的:(对象)