Item 5. 불필요한 객체는 만들지 말라.

기능적으로 동일한 객체는 필요할 때마다 만드는 것 보다 재사용하는 편이 낫다.
변경 불가능 객체는 언제나 재사용할 수 있다.

String s0 = new String("foo"); // 절대 이렇게 쓰지 말것 !!!
String s1 = "foo";

변경 불가능한 객체뿐 아니라, 변경 가능한 객체도 재사용할 수 있다.

public class Person{
	final Date birthDate;
	
	// 1946~1964년 사이에 태어난 사람이면 참을 반환
	public boolean isBadyBoomer(){
		Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
		gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
		Date boomStart = gmtCall.getTime();
		gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
		Date boomEnd = gmtCal.getTime();
		
		return birthDate.compareTo(boomStart) >= 0 
		    && birthDate.compareTo(boomEnd) < 0; 
	}
}

위와 같이, 생성 비용이 높은 객체(Calendar)를 isBadyBommer 메소드가 호출될 때 마다 생성하는 것 보다, 정적 초기화 블록(static initializer)를 통새 개선하는 것이 좋다.

public class Person{
	final Date birthDate;
	static final Date BOOM_START;
	static final Date BOOM_END;
	static{
		Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
		gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
		BOOM_START = gmtCall.getTime();
		gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
		BOOM_END = gmtCal.getTime();
	
	}
	
	// 1946~1964년 사이에 태어난 사람이면 참을 반환
	public boolean isBadyBoomer(){
		return birthDate.compareTo(BOOM_START) >= 0 
		    && birthDate.compareTo(BOOM_END) < 0; 
	}
}

JDK 1.5 이상 부터는 자바 기본 자료형(primitive type)에 대해서, 자동 객체화(autoboxing)을 지원한다. 자동 객체화 덕에 기본 자료형과 그 객체 표현형 사이의 차이가 희미해지긴 했지만, 아주 없어진 것은 아니다. 의미적인(semantic)차이는 미미하지만, 성능 차이는 무시하기 어렵다.

public static void main(String[] args){
	Long sum = 0L;
	for(long i = 0; i < Integer.MAX_VALUE; ++i){
		sum += 1;
	}
	System.out.println(sum);
)

위와 같이 반복문에서 sum(Long 자동 객체화 타입)에 값을 저장하면 2^31객의 Long객체가 만들어지기 때문에 무시무시하게 느리게 동작한다.

자동 객체화 타입 대신 기본 자료형을 사용하고, 생각지도 못한 자동 객체화가 발생하지 않도록 유희해야 한다.