지연초기화를 사용한다면 인스턴스 생성 시의 초기화 비용은 줄지만 그 대신 필드에 접근하는 비용은 커짐
→ 지연 초기화 필드중 초기화가 이뤄지는 비율에 따라, 실제 초기화에 드는 비용에따라, 초기화된 각 필드를 얼마나 빈번히 호출하느냐에 따라 지연 초기화가 실제로는 성능을 느려지게 할 수 있음
지연 초기화 사용하는 게 좋은 경우
또한 멀티스레드 환경에서는 지연 초기화 하는 필드를 둘 이상의 스레드가 공유한다면 어떤 형태로든 반드시 동기화 해야함
일반적 초기화 예제
public class TestClass {
private final Member member = createMember();
private Member createMember() {
return new Member("KJJ");
}
}
인스턴스 필드의 지연초기화
public class TestClass {
private Member member;
public synchronized Member getMember(){
if(member==null){
member = createMember();
}
return member;
}
private Member createMember() {
return new Member("KJJ");
}
}
지연 초기화가 초기화 순환성(initialization circularity) 을 깨뜨릴 것 같으면 synchronized 를 단 접근자를 사용하자
정적 필드용 지연 초기화 홀더 클래스 관용구
public class TestClass {
static final private Member member = createMember();
private static Member createMember() {
System.out.println("init");
return new Member("KJJ");
}
public static Member getMember(){
return TestClass.member;
}
}