2014-12-04 1 views
1

Singleton1#INSTANCESingleton2#INSTANCE 인 반면, final되지 않습니다 : 클래식 싱글 톤 패턴 (있는 경우)에서 최종 인스턴스를 사용하면 어떤 이점이 있습니까? 아래의 코드에서

public class Singleton1 { 

    private static Singleton1 INSTANCE = new Singleton1(); 

    private Singleton1() {} 

    public static Singleton1 getInstance() { 
     return INSTANCE; 
    } 

} 

public class Singleton2 { 

    private static final Singleton2 INSTANCE = new Singleton2(); 

    private Singleton2() { 

    public static Singleton2 getInstance() { 
     return INSTANCE; 
    } 

} 

Singleton1 이상 Singleton2의 장점은 (있는 경우)이란 무엇입니까

?

답변

4

자바가 없습니다. Class initialization happens atomically, within locks. 스레드가 부분적으로 생성 된 Singleton1#INSTANCE을 볼 수 없습니다.

이 시점에서 final을 사용하여이 필드가 변경되지 않아야 함을 개발자에게 알립니다.

3

성능이 인 경우 대답이 없음을 확실히 알고 있습니다. 누군가가 유지 보수주기 동안 어떤 시점에서 참조를 수정하려고하면 버그를 예방할 수 있습니다.

1) 불변성 용 - -

2

마지막은 기본적으로 자바의 두 가지 목적을 위해 사용되는 필드가 최종 경우, 그것은 단지 한 번만 초기화 할 수 있습니다. INSTANCE가 final이 아닌 경우 하나 이상의 객체를 다시 만들 수 있지만 생성자는 private이므로이 작업을 수행 할 수 있습니다. 따라서 기본적으로 최종은 Elliott이 언급 한 나중 단계에서 소개 될 수있는 다른 버그를 피할 수 있습니다.

2) 게시하기 전에 객체가 올바르게 구성되었는지 (멀티 스레딩의 컨텍스트에 있음), 클래스로드 (인스턴스로드)에 대한 INSTANCE가 인스턴스화되기 때문입니다. 문제가 발생하지 않습니다. 그것은 오래 사용될 것입니다.

관련 문제