JAVA/Effective Java
규칙5 불필요한 객체는 만들지 말라
소농배
2018. 12. 19. 20:24
![]() |
|
기능적으로 동일한 객체는 필요할 때 마다 만드는 것보다 재사용 하는 편이 낫다.
변경 불가능한(immutable) 객체는 언제나 재사용할 수 있다.
극단적인 예제
String s = new String("stringette");
String 생성자에 전달되는 "stringette" 자체가 string 객체이다.
String s = "stringette";
위 방법이 바람직 하다
또 다른 극단적인 예제
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.JANAUARY, 1, 0, 0, 0);
Date boomEnd = gmtCal.getTima();
return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;
}
}
isBabyBoomer() 가 호출될 때 마다 Calendar 객체, TimeZone 객체, Date객체 가 쓸데없이 만들어 진다. 정적 초기화 블록(static initializer)을 통해 개선하는 것이 좋다.
public 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);
Date boomStart = gmtCal.getTime();
gmtCal.set(1965, Calendar.JANAUARY, 1, 0, 0, 0);
Date boomEnd = gmtCal.getTima();
}
public boolean isBabyBoomer() {
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
}
}
또 다른 극단적인 예
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 으로 선언되어야 하는데 Long 으로 선언함으로서 2의31승 개의 객체가 생성되었다. 여기서 얻을 수 있는 교훈은
객체 표현형 대신 가본 자료형을 사용하고, 생각지도 못한 자동 객체화가 발생하지 않도록 유의