Java에서 Enum을 싱글 톤으로 사용하는 가장 좋은 방법은 무엇입니까?


85

SO 질문에 쓰여진 것을 기반으로 작성 Java에서 Best Singleton Implementation- 즉 enum을 사용하여 singleton을 만드는 방법-차이점 / 장점 / 단점은 무엇입니까 (생성자 생략)

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

그리고 전화 Elvis.INSTANCE.getAge()

public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}

그리고 전화 Elvis.getAge()

답변:


96

주어진 객체의 속성을 사용하는 무언가에 바인딩한다고 가정합니다. Elvis.INSTANCE를 매우 쉽게 전달할 수 있지만 Elvis.class를 전달할 수없고 속성을 찾을 것으로 기대할 수 없습니다 (고의적으로 찾을 수 있도록 코딩 된 경우 제외). 클래스의 정적 속성).

기본적으로 인스턴스 를 원할 때만 싱글 톤 패턴을 사용합니다 . 정적 메서드가 제대로 작동하면 해당 메서드를 사용하고 열거 형에 신경 쓰지 마십시오.


1
열거 형에 신경 쓰지 않는 이유는 무엇입니까? java5 +에서 singeltons를 수행하는 더 좋은 방법이 있습니까?
jontro

4
@jontro (다시) 답변을 읽으십시오. 그는 당신이 싱글 톤을 가져야 할 때 열거 형을 사용하되, 정적 메소드로 할 수 있다면 싱글 톤을 피하라고 말한다
Miserable Variable

@MiserableVariable 1 년 전에 이에 대해 언급했습니다. 내가 언급 한 문맥이 무엇인지 정말로 기억할 수 없습니다.
jontro

묻는 질문에 대답하지 않습니다
Thufir

2
@Thufir : "차이가 무엇인지"부분에 대한 답변입니다. 답변이 받아 들여 졌기 때문에 OP가 가장 관심을 두었던 것으로 보입니다.
Jon Skeet 2013 년

69

큰 장점은 싱글 톤이 인터페이스를 구현해야 할 때입니다. 귀하의 예를 따르면 :

public enum Elvis implements HasAge {
    INSTANCE;
    private int age;

    @Override
    public int getAge() {
        return age;
    }
}

와:

public interface HasAge {
    public int getAge();
}

통계로는 할 수 없습니다 ...


1
그것은 정적으로 할 수 있습니다 ... public static final HasAge INSTANCE = new HasAge () {private int age; @Override public int getAge () {return age; }}; ... 그래서 나는 여전히 enum 메소드에 대해 무엇이 좋고 더 나은지 궁금합니다. 두 개의 인터페이스를 구현해야한다면?
Sean Adkinson jul.

9

(Stateful) 싱글 톤은 일반적으로 정적 변수를 사용하지 않는 척하는 데 사용됩니다. 실제로 공개 정적 변수를 사용하지 않으면 사람을 속일 수 있습니다.


8

가장 간단하고 명확한 옵션을 선택하겠습니다. 이것은 다소 주관적이지만 가장 명확한 것을 모르는 경우 가장 짧은 옵션을 선택하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.