티스토리 뷰

이펙티브 자바 Effective Java 2/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이병준역
출판 : 인사이트 2014.09.01
상세보기

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

극단적인 예제

String s = new String("stringette");

String 생성자에 전달되는 "stringette" 자체가 string 객체이다. 

String s = "stringette";

위 방법이 바람직 하다

또 다른 극단적인 예제

public class Person { private final Date birthDate; public boolean isBabyBoomer() { Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0); Date boomStart = gmtCal.getTime(); gmtCal.set(1965, Calendar.JANAUARY, 1, 0, 0, 0); Date boomEnd = gmtCal.getTima(); return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0; } }

isBabyBoomer() 가 호출될 때 마다 Calendar 객체, TimeZone 객체, Date객체 가 쓸데없이 만들어 진다. 정적 초기화 블록(static initializer)을 통해 개선하는 것이 좋다.

public class Person { private final Date birthDate; 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); Date boomStart = gmtCal.getTime(); gmtCal.set(1965, Calendar.JANAUARY, 1, 0, 0, 0); Date boomEnd = gmtCal.getTima(); } public boolean isBabyBoomer() { return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0; } }

또 다른 극단적인 예

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

sum 은 Long 이 아니라 long 으로 선언되어야 하는데 Long 으로 선언함으로서 2의31승 개의 객체가 생성되었다. 여기서 얻을 수 있는 교훈은
 객체 표현형 대신 가본 자료형을 사용하고, 생각지도 못한 자동 객체화가 발생하지 않도록 유의



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함