기능이 똑같다면 매번 생성하지 말고, 이미 만들어진 객체를 재사용하라고 주장한다. 자바에서 객체의 생성과 Garbage Collection 은 언제나 오버헤드가 크기 떄문이다.

따라하면 안되는 예시

String 의 생성

new String, Integer, Boolean 등등을 하면 항상 새로운 객체가 만들어진다. valueOf 를 사용하도록 하자.

// bad
String s1 = new String("bikini");

//good
String s2 = String.valueOf("bikini");

정규표현식

String.matches 로 졍규표현식을 반복해서 사용하려하면, Pattern 인스턴스가 매번 새로 만들어지고 버려지게 된다. Pattern 인스턴스튼 static final 로 정의해두고 활용하도록 하자.

// bakd
static boolean isRomanNumeral(String s) {
    return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
        + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}
// good
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 isRomanNumeral(String s) {
        return ROMAN.matcher(s).matches();
    }
}

오토박싱 (auto boxing)

오토박싱: 기본 타입(long) 과 박싱된 기본타입(Long) 을 섞어 쓸 때 자동으로 변환해주는 기술

의도치 않은 오토박싱이 있으면 성능 저하가 된다. 박싱된 기본 타입 보다는 기본 타입을 사용하자.

private static long sum() {
    Long sum = 0L; // 불필요한 오토박싱
    for (long i = 0; i <= Integer.MAX_VALUE; i++)
        sum += i;
    return sum;
}