불변 클래스의 불필요한 객체 생성을 막으려면 생성자 보다는 static factory method를 사용하는 것이 좋다.
아래 예를 들어보자
import java.util.*; public class Person { public Person(Date birthDate) { // Other fields, methods omitted // DON'T DO THIS! |
위의 코드를 보면 Calendar 객체와 TimeZone 객체 및 두 개의 Date 인스턴스를 불필요하게 생성한다.
윗 부분을 아래와 같이 고치면 좀 더 성능이 좋아진다.
import java.util.*; class Person { public Person(Date birthDate) { // Other fields, methods /** static { public boolean isBabyBoomer() { |
근데 위에 성능이 좋아지긴 하지만 항상 그런 건 또 아니다.
이유는 Calender 인스턴스의 생성비용이 많이 들기도 하지만 isBabyBoomer 메소드가 아예 호출되지 않는다면 BOOM_START와 BOOM_END가 쓸데없이 초기화되기 때문이다. 근데 이걸 배제하려면 lazy initialization을 해야하는데 그닥 권장하지 않는다.
자바에서는 오토박싱(autoboxing)이란 것으로 불필요한 객체를 생성하게 되는데 이건 기본형 데이터를 이에 대응되는 박스화 기본현 클래스 객체로 자동 변환을 해주는 기능이다. 이와 반대로 하는 것이 오토언박싱(autounboxing)이다.
Long sum = 0L; <- 오토박싱된다.
문제는 이러면 엄청나게 느려질 수 있다. 그러니까 의도하지 않은 오토박싱이 생기지 않도록 주의해야 한다.
'개발 이야기 > Effective Java' 카테고리의 다른 글
Item 7. 파이널라이저(Finalizer)의 사용을 피하자 (0) | 2010.03.08 |
---|---|
Item 6. 쓸모 없는 객체 참조를 제거하자. (0) | 2010.03.08 |
Item 4. private 생성자를 사용하여 인스턴스 생성을 못하게 하자. (0) | 2010.03.04 |
Item 3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. (0) | 2010.03.04 |
Item 2. 생성자의 매개변수가 많을 때는 빌더를 고려하자. (0) | 2010.03.04 |