[Effective Java 3/e] 아이템 6 - 불필요한 객체 생성을 피하라


아이템 6 - 불필요한 객체 생성을 피하라

//따라 하지 말 것
String s = new String("bikini");

//개선 된 버전
String s = "bikini"; // 같은 가상 머신 안에서 이와 똑같은 문자열 리털을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다.

값비싼 정규 표현식

static boolean isRomanNumeric(String s) {
  return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
          + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}
  • String.matches는 내부에서 정규표현식용 Pattern 인스턴스는, 한 번 쓰고 버려진다.

값비싼 객체를 재사용해 성능을 개선

public class RomanNumerals {
  private static final Pattern ROMAN = Pattern.compile(
    "^(?=.)M*(C[MD]|D?C{0,3})"
            + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");

  static boolean isRomanNumeric(String s) {
    return ROMAN.matcher(s).matches();
  }
}
  • Pattern 인스턴스를 클래스 초기화(정적 초기화) 과정에서 직접 생성해 캐싱
  • isRomanNumeral 메서드가 호출될 때마다 인스턴스 재사용

의도치 않은 오토박싱

private static long sum() {
  Long sum = 0L;
  for (long i = 0; i <= Integer.MAX_VALUE; i++){
    sum += i;
  }
  return sum;
}
  • sum 변수를 long 이 아닌 Long 으로 선언해서 불필요한 Long 인스턴스가 만들어진다.
    • long 타입인 i가 Long 타입인 sum에 더해질 때마다
  • 박싱된 기본 타입 보다는 기본 타입을 사용하고, 의도치 않은 오토박싱에 주의해야 함