[effective java] (3) Singleton

orca·2022년 10월 28일
0

effective java

목록 보기
3/8

자바의 본질을 실무에 적용하는 이펙티브 자바 강의를 듣고 정리한 내용입니다

Sigleton

오직 하나의 인스턴스만 생성할 수 있는 클래스
싱글톤 패턴을 사용하면 쉽게 객체의 유일성을 보장할 수 있음

생성자를 private으로 선언해서 사용자가 호출할 수 없게 함 > 의도하지 않은 객체 생성을 막음

public static final Speaker INSTANCE = new Speaker();

private Speaker(){}

or

private static final Speaker INSTANCE = new Speaker();

private Speaker(){}

public static Speaker getInstance(){
        return INSTANCE;
}
        

Lazy initialization

메모리 누수를 막기 위해 Singleton 객체가 필요한 시점에 인스턴스를 생성하는 방식
두 개 이상의 스레드가 Singleton.getInstance()를 호출한다면 위험함

 private static Speaker instance;
 
 private Speaker(){}
 
 public static Speaker getInstance(){
        if(instance == null){
            instance = new Speaker();
        }
        return instance;
    }

Thread safe Lazy initialization

Lazy initialization에서 non-thread safety 한 점 보완

private static Speaker instance;
 
private Speaker(){}

public static synchronized Speaker getInstance(){
        if(instance == null){
            instance = new Speaker();
        }
        return instance;
    }

Enum을 활용해 Singleton 구현

enum의 본래 의도와 맞지 않아 보기에 부자연스러움

public enum AnotherSpeaker {

    private String message;

    public AnotherSpeaker getInstance(){
        return INSTANCE;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

enum으로도 싱글톤이 구현되는 걸 확인함

 @GetMapping("/singleton")
    public AnotherSpeaker getSpeaker(){
        AnotherSpeaker speaker = AnotherSpeaker.INSTANCE.getInstance();
        speaker.setMessage("안내 방송 중입니다.");

        AnotherSpeaker speaker2 = AnotherSpeaker.INSTANCE;


		System.out.println(speaker.getMessage());
        System.out.println(speaker2.getMessage());

        return speaker;
    }

0개의 댓글