참조: 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_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();
}

1.5에서 불필요한 객체를 생성하게 된 경우.
- autoboxing/unboxing.
- primive 타입을 사용 선호하고, 의도하지 않은 autoboxing을 하지는 않는지 조심해야 한다.

// Hideously slow program! Can you spot the object creation?
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)을 만들어서 관리하려는 건 비추한다. 객체 풀 관리하다가, 메모리 잡아먹고, 성능 문제가 생길 수도 있다.