[Effective Java] 챕터3. private 생성자나 열거타입으로 싱글턴임을 보증하라

Posted by 김성철

Effective Java - 챕터3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

정적 팩토리 방식

객제의 인스턴스가 오직 하나만 생성되는 패턴으로 아래와 같이 구현할 수 있음  
=================================================================================================================  
public class Singleton {  
  
	private static Singleton instance = new Singleton();  
  
	private Singleton() {  
		// 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.  
	}  
  
	public static Singleton getInstance() {  
		return instance;  
	}  
  
	public void say() {  
		System.out.println("hi, there");  
	}  
}  
  
=================================================================================================================  
  
Singleton.getInstance() 를 호출할때 객체가 생성되고 더이상은 해당 객체를 생성하지 않고  
기존의객체만을 가져다 사용함  

public static final 필드의 방식

아래의 방식으로 직접 생성한 객체에 접근할수도 있음  
다만 AccessibleObject.setAccessible 를 사용해서 private 생성자를 호출할 수 잇으므로, 예외처리를 만들어 줘야함  
=================================================================================================================  
public class Singleton{  
	public static Singleton instance = new Singleton();  
  
	private Singleton(){  
		// 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.  
	}  
  
	public void say() {  
		System.out.println("hi, there");  
	}  
  
}  
  
=================================================================================================================  

열거 타입 방식

public 방식과 비슷하지만, 더 간결하고 추가적인 노력없이 직렬화 할수 있음  
조금 부자연스러워보여도 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법임  
=================================================================================================================  
public enum Singleton{  
	INSTANCE;  
	public void say() {  
		System.out.println("hi, there");  
	}  
}  
  
//호출은 아래와 같이 사용  
##################################################################################################################  
public class EnumMain {  
	public static void main(String[]args){  
		Singleton singleton = Singleton.INSTANCE;  
		singleton.say();  
	   }  
}  
  
=================================================================================================================