programing

Enum을 사용한 싱글턴 구현(Java)

yoursource 2022. 8. 9. 21:52
반응형

Enum을 사용한 싱글턴 구현(Java)

로는 실행이 .Singleton에서 Java를 하는 경우Enum예를 들어 다음과 같습니다.

public enum MySingleton {
     INSTANCE;   
}

런데 위위 어?? 「」라고 하는 것은,Object인스턴스화해야 합니다. 그럼 여, 때는 요?MySingleton스턴턴 ?는 ?? ???? 하고 있습니까?new MySingleton()

이것.

public enum MySingleton {
  INSTANCE;   
}

에는 암묵적인 빈 생성자가 있습니다.대신 분명히 말하세요

public enum MySingleton {
    INSTANCE;
    private MySingleton() {
        System.out.println("Here");
    }
}

다른 에서 그, 른, 른, 른, 른, 른, 른, 른, 른, with, with, with, with, if, if, with, if, if,main()★★★★★★★★★★★★★★★ 의

public static void main(String[] args) {
    System.out.println(MySingleton.INSTANCE);
}

아시겠죠?

Here
INSTANCE

enum입니다만, 이러한 는 컴파일 시간 상수입니다.enumtype. 그리고 enum type이 처음 참조될 수 있습니다.

enum입니다.class.

의 ★★★★★★★★★★★★★★★★★.enum .

public final class MySingleton {
    public final static MySingleton INSTANCE = new MySingleton();
    private MySingleton(){} 
}

가 접속했을 때INSTANCE , sclass , sclass.MySingletonJVM을 이용하다, 「」가 됩니다.static한 번(불쾌하게) 위에 있다.

Joshua Bloch가 작성한 이 Java 베스트 프랙티스북에서는 프라이빗 컨스트럭터 또는 Enum 타입을 사용하여 Singleton 속성을 강제 적용해야 하는 이유를 확인할 수 있습니다.이 장은 상당히 길기 때문에 요약된 내용을 유지합니다.

클래스를 싱글톤으로 만드는 것은 클라이언트를 테스트하는 것을 어렵게 만들 수 있습니다.싱글톤이 타입으로 기능하는 인터페이스를 실장하지 않는 한 싱글톤을 모의 실장으로 대체하는 것은 불가능하기 때문입니다.권장되는 접근법은 단순히 하나의 요소로 열거형을 만드는 것만으로 싱글톤을 구현하는 것입니다.

// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}

이 접근방식은 보다 간결하고 시리얼라이제이션머신을 무료로 제공하며 복잡한 시리얼라이제이션 또는 리플렉션 공격 시에도 여러 인스턴스화에 대한 확실한 보증을 제공한다는 점을 제외하면 퍼블릭필드 접근방식과 기능적으로 동등합니다.

이 접근방식은 아직 널리 채택되지 않았지만 단일 요소 열거형이 싱글톤을 구현하는 가장 좋은 방법이다.

모든 열거 인스턴스와 마찬가지로 Java는 클래스가 로드될 때 각 개체를 인스턴스화합니다. 일부는 클래스가 JVM당 정확히 한 번 인스턴스화됨을 보장합니다.생각해 보세요INSTANCE퍼블릭 스태틱 최종 필드로 선언: Java는 클래스를 처음 참조할 때 개체를 인스턴스화합니다.

인스턴스는 스태틱 초기화 중에 생성됩니다.이거는 Java 언어 사양 섹션 12.4에 정의되어 있습니다.

Joshua Bloch는 이 패턴을 Effective Java Second Edition의 항목 3으로 자세히 설명하고 있습니다.

앞서 어느 정도 언급했듯이, 열거형은 정의가 적어도 하나의 "enum 상수"로 시작해야 하는 특별한 조건을 가진 자바 클래스입니다.

이와는 별도로 Enum을 확장하거나 다른 클래스를 확장하는 데 사용할 수 없습니다. 열거형은 모든 클래스와 같은 클래스이며 상수 정의 아래에 메서드를 추가하여 사용합니다.

public enum MySingleton {
    INSTANCE;

    public void doSomething() { ... }

    public synchronized String getSomething() { return something; }

    private String something;
}

싱글톤의 메서드는 다음 행에서 액세스 할 수 있습니다.

MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();

클래스가 아닌 열거형을 사용하는 것은 다른 답변에서 언급한 바와 같이 대부분 싱글톤의 스레드 세이프 인스턴스화와 항상 1개의 복사본일 것이라는 보증에 관한 것입니다.

그리고 가장 중요한 것은 이 동작이 JVM 자체와 Java 사양에 의해 보장된다는 것입니다.

다음은 열거 인스턴스의 여러 인스턴스를 방지하는 방법에 대한 Java 사양의 섹션입니다.

열거형에는 열거형 상수에 의해 정의된 인스턴스 이외의 인스턴스가 없습니다.열거형을 명시적으로 인스턴스화하려고 하면 컴파일 시 오류가 발생합니다.Enum의 최종 클론 메서드는 열거 상수를 클론할 수 없음을 보증합니다.시리얼라이제이션메커니즘에 의한 특별한 처리를 통해 중복 인스턴스가 디시리얼라이제이션의 결과로 생성되지 않도록 합니다.열거형식의 반영 인스턴스화는 금지되어 있습니다.이 4가지 요소를 조합하면 열거형 인스턴스가 열거형 상수에 의해 정의된 인스턴스보다 더 이상 존재하지 않습니다.

유의할 점은 인스턴스화 후 스레드 안전에 관한 우려는 synchronized 키워드 등을 사용하여 다른 클래스와 마찬가지로 처리해야 한다는 것입니다.

Singleton Pattern은 개인 컨스트럭터를 가지고 인스턴스화를 제어하는 메서드를 호출하는 것이므로(예를 들어 일부)getInstanceEnums에는 이미 암묵적인 프라이빗 컨스트럭터가 있습니다.

JVM 또는 일부 컨테이너가 NAT의 인스턴스를 제어하는 방법을 정확히 알지 못합니다.Enums하지만 이미 암묵적인 명령어를 사용하고 있는 것 같습니다.Singleton Pattern다른 점이라면, 우리는 A/S로 부르지 않는다는 것입니다.getInstanceEnum을 호출합니다.

언급URL : https://stackoverflow.com/questions/26285520/implementing-singleton-with-an-enum-in-java

반응형