2012-10-02 4 views
14

Java Enum 기반 싱글 톤을 초기화하는 올바른 방법은 객체를 사용하기 전에 초기화해야하는 경우입니다.Java enum 기반의 Singleton을 초기화하는 방법은 무엇입니까?

나는 코드를 작성하기 시작했으나 제대로하고 있는지 확실하지 않습니다. 나를 위해이 싱글 톤을 구현하도록 도와 주시겠습니까? 것을

public enum BitCheck { 

    INSTANCE; 

    BitCheck() { 
     props = new HashMap<String, String>(); 
    } 

    private final Map<String, String> props; 

    //.. 

} 

참고 :

public enum BitCheck { 

    INSTANCE; 

    private static HashMap<String, String> props = null; 

    public synchronized void initialize(HashMap<String, String> properties) { 
     if(props == null) { 
      props = properties; 
     } 
    } 

    public boolean isAenabled(){ 
     return "Y".equalsIgnoreCase(props.get("A_ENABLED")); 
    } 

    public boolean isBenabled(){ 
     return "Y".equalsIgnoreCase(props.get("B_ENABLED")); 
    } 

} 
+0

나는 이것을 좋아하지 않는다. 달성하려는 것은 무엇인가? – zengr

+0

이미 싱글 톤을 사용하고있을 때 하나의 요소 만있는 열거 형이 필요한 이유는 무엇입니까? – Dunes

+0

@Dunes 싱글 톤을 사용하여 코드베이스 전체에서 값을 확인하는 데 사용할 수 있습니다. 시작하는 동안 속성으로 초기화하고 프로젝트 전체에서 확인 방법을 사용합니다. –

답변

30

그것은 enum에 대한 생성자를 만들 완벽하게 가능

  • props 필드가 마지막이 될 수 있습니다 (우리가 final처럼)
  • 에게
  • props는 없습니다 ~로 되려면 static
  • 생성자가 자동으로 열심히 호출됩니다.

마지막으로주의하십시오. enum부터 enum BitCheck 클래스가로드 될 때 - 싱글 톤이 열정적으로 만들어지기 때문에 생성자에 인수를 전달할 방법이 없습니다.

public enum BitCheck { 

    INSTANCE(new HashMap<String, String>()); 

    BitCheck(final Map<String, String> props) { 
     this.props = props; 
    } 

는하지만, 바로 차이를하지 않습니다 물론 INSTANCE 선언을 통해 할 수 있습니까? 달성하고자하는 것은 무엇입니까? 아마 당신은 실제로 게으른 초기화 싱글 톤이 필요할까요?

+0

나는 그것이 좋지 않을 것이라고 생각한다. 생성자가 좋은 것을 제공하지 못하기 때문에 이렇게 만드는 것이 좋다. 그것은 단순한 선언이 될 수 있습니다. –

+0

값의 집합으로 초기화하고 싶은데, 그것을 싱글 톤에 전달하고 싶습니다. 어떻게해야합니까? 귀하의 예제는 빈 해시 맵으로 초기화됩니다. –

+1

@ java_mouse : 그게 문제 야. 외부에서 생성자에게 아무 것도 전달할 방법이 없습니다. 'enum'싱글 톤이 도움이되지 않습니다. –

1
public enum BitCheck { 

    INSTANCE; 

    private BitCheck() { 
     // initialize here 
    } 

} 
5

선언에서 초기화해야합니다.

public enum BitCheck { 
    INSTANCE; 
    private final Map<String, String> props = new ConcurrentHashMap<String, String>(); 

    public void putAll(HashMap<String, String> map) { 
     props.putAll(map); 
    } 
} 
+0

+1, 어떻게 든 당신은'props'를 동기화해야합니다. –

+0

예. 고마워. –

0

Enum 기반 싱글 톤 코드에서 이와 같은 방법을 시도해 볼 수 있습니다. 이렇게하면 Singleton을 정확히 한 번 초기화 할 수 있습니다.

private static Properties props; 
private static AtomicBoolean isInitialized = new AtomicBoolean(false); 

public void init(Properties props){ 
    if(isInitialized.compareAndSet(false, true)) { 
     this.props = props; 
    } 
} 

참고 : 더 복잡한 초기화를 들어, (-는 IsInitialized 대신 단일 AtomicBoolean의) initStarted 및 initCompleted 2 AtomicBooleans가 필요합니다. 그런 다음 첫 번째 스레드는 initStarted를 설정하고 초기화 단계를 실행하고 나머지는 initCompleted가 첫 번째 스레드에서 true로 설정 될 때까지 대기합니다.

관련 문제