자바의 본질을 실무에 적용하는 이펙티브 자바 강의를 듣고 정리한 내용입니다
오직 하나의 인스턴스만 생성할 수 있는 클래스
싱글톤 패턴을 사용하면 쉽게 객체의 유일성을 보장할 수 있음
생성자를 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;
}
메모리 누수를 막기 위해 Singleton 객체가 필요한 시점에 인스턴스를 생성하는 방식
두 개 이상의 스레드가 Singleton.getInstance()를 호출한다면 위험함
private static Speaker instance;
private Speaker(){}
public static Speaker getInstance(){
if(instance == null){
instance = new Speaker();
}
return instance;
}
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의 본래 의도와 맞지 않아 보기에 부자연스러움
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;
}