Effective Java 学习笔记(5)
2010-01-21 12:24
417 查看
尽量复用对象,而不是创建新的对象,特别是当一个对象是immutable(不可改变)的时候。
如String对象,
String s= new String(“String”); 千万不要这样做,因为这里实际上创建了两个对象。
要避免出现这样的情况,
1是可以用静态工厂函数,来解决,如类库中的Boolean.valueOf(“true”),这种方式要优于new Boolean(“true”);
2.是尽量复用对象。
看书中的例子。
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就会创建两个Data对象,一个Calendar对象和TimeZone对象.
改进版:
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;
}
}
这个改进版把这现两个常量作成了static,这样,只在加载的时候创建对象,以后调用就不产生任何对象。
还一个问题是要注意基本类型和对象的转换。要注意避免写以下的程序。以下会在加和比较的时候创建一个Long对象,这根本不是必要的。
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
如String对象,
String s= new String(“String”); 千万不要这样做,因为这里实际上创建了两个对象。
要避免出现这样的情况,
1是可以用静态工厂函数,来解决,如类库中的Boolean.valueOf(“true”),这种方式要优于new Boolean(“true”);
2.是尽量复用对象。
看书中的例子。
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就会创建两个Data对象,一个Calendar对象和TimeZone对象.
改进版:
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;
}
}
这个改进版把这现两个常量作成了static,这样,只在加载的时候创建对象,以后调用就不产生任何对象。
还一个问题是要注意基本类型和对象的转换。要注意避免写以下的程序。以下会在加和比较的时候创建一个Long对象,这根本不是必要的。
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
相关文章推荐
- 我的Effective Java 学习笔记(一)
- effective java 学习笔记(一) 2012-4-24
- Effective Java 学习笔记(1)
- Effective Java 学习笔记(2)
- effective java 学习笔记
- Effective Java 学习笔记 (10)
- Effective Java 学习笔记(15)
- effective-java 学习笔记(1)
- Effective Java学习笔记 第61条: 抛出与抽象相对应的异常
- Effective Java 学习笔记(二)
- Effective Java 学习笔记(9)
- Effective Java 学习笔记 (6)
- Effective Java-学习笔记(10-11章)
- effective java 学习笔记(一)
- effective java 学习笔记(二)
- Effective Java 学习笔记 (11)
- Effective Java 学习笔记(25)
- effective Java 学习笔记(三)
- Effective Java-学习笔记(2-5章)
- Effective Java 学习笔记(四、五)