티스토리 뷰

지연초기화

  • 필드의 초기화 시점을 그 값이 처음 필요할때까지 늦추는 기법이다
  • 그래서 값이 전혀 쓰이지 않으면 초기화도 일어나지 않는다

대부분의 상황에서 일반적인 초기화가 지연 초기화보다 낫다

  • 지연 초기화가 초기화 순환성(initialization circularity)을 깨뜨릴 것 같으면 synchronized를 단 접근자를 사용
private FieldType field;
private synchronized FieldType getFieldO { 
    if (field = null)
        field = computeFieldValue〇; 
    return field;
}
  • 성능 때문에 정적 필드를 지연 초기화해야 한다면 지연 초기화 홀더 클래스 (lazy initialization holder class) 관용구를 사용
  • getField 메서드가 필드에 접근하면서 동기화를 전혀 하지 않으니 성능이 느려질 거리가 전혀 없다는 것이다
private static class FieldHolder {
    static final FieldType field = computeFieldValue();
}
private static FieldType getField() { return FieldHolder.field; }
  • 성능 때문에 인스턴스 필드를 지연 초기화해야 한다면 이중검사(double­ check) 관용구를 사용
private volatile FieldType field;

private FieldType getField() {
    FieldType result = field;
    if(result!=null){ //첫 번째 검사 (락 사용 안 함)
        return result;
    synchronized(this) { 
        if(field==null)//두 번째 검사 (락 사용)
            field = computeFieldValue(); 
        return field;
    } 
}

핵심 정리

대부분의 필드는 지연시키지 말고 곧바로 초기화해야 한다.성능 때문에 혹은 위험한 초 기화 순환을 막기 위해 꼭 지연 초기화를 써야 한다면 을바른 지연 초기화 기법을 사용 하자.인스턴스 필드에는 이중검사 관용구를,정적 필드에는 지연 초기화 홀더 클래스 관 용구를 사용하자.
반복해 초기화해도 괜찮은 인스턴스 필드에는 단일검사 관용구도 고려 대상이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함