EJ2E Item 5. 불필요한 객체 생성 방지하기
참조: Effective Java 2nd Edition Item 5. Avoid creating unnecessary objects
객체를 매번 새로 생성하는 것보다 재사용하는게 당연히 더 빠르고 적절한 방법이다.
String s = new String("stringette"); 이렇게 쓰지 말것.
위 방법은 매번 새로운 String 객체 생성한다.
String s= "stringette"; 이렇게 쓸 것.
이 방법은 매번 하나의 String 객체를 사용한다. 또한 이 경우 VM에 같은 문자열을 참조하는 코드가 있을 때 같은 객체를 재사용한다.[JLS, 3.10.5]
static factory method[item 1]를 사용해서 조정할 수 있다. 생성자를 사용하면 무조건 새로운 객체를 생성하지만, 이 녀석은 꼭 그래야 하진 않으니까.
mutable 객체 재활용하는 방법
- static initialization.
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();
}
1.5에서 불필요한 객체를 생성하게 된 경우.
- autoboxing/unboxing.
- primive 타입을 사용 선호하고, 의도하지 않은 autoboxing을 하지는 않는지 조심해야 한다.
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
(캬오.. 위 코드에 그렇게 심각한 문제가 있었다니.. ㄷㄷㄷ...)
이번 Item을 읽으면서 주의할 것은 객체 생성이 굉장히 비싼 일이고 기피해야 할 것은 아니라는 것이다. 코드를 보다 분명하게 하고, 간단하게 하기 위해 객체 생성을 명시적으로 하는 것은 괜찮다.
반대로 비싼 객체를 자신만의 객체 풀(object pool)을 만들어서 관리하려는 건 비추한다. 객체 풀 관리하다가, 메모리 잡아먹고, 성능 문제가 생길 수도 있다.