DevBoi

[Effective Java] 3. 싱글톤 패턴 본문

Language/[Java]

[Effective Java] 3. 싱글톤 패턴

HiSmith 2022. 5. 11. 15:52
반응형

싱글턴이란 객체를 하나만 생성하는 것이다.

인터페이스를 구현한 싱글턴 객체가 아니라면 , mock을 사용하여 테스트 하기 어렵다.

 

내부 인스턴스를 static final로 두고, private 생성자로서 사용한다면,

내부 static 인스턴스가 초기화 될떄 딱 한번만 privatee 생성자가 돌고, 이 인자는 하나뿐임을 보장한다.

 

유일하게  인스턴스 get 부분만 public 인경우, instance를 하나만 가지고 있고 이를 return 하는 것을 보장할 수있다.

(final)

 

장점

향후 확장성이 있다. 다른 인스턴스(새로운 인스턴스)가 필요하다면 언제든지 신규 메소드를 추가해서 사용할 수 있다

리플렉션 방어가 된다. setAccessible 를 사용해 private 생성자에 접근 할 수 있는데 이떄 

instance의 널체크를 해서 exception처리를 해주면 된다.

 

직렬화 문제implements Serialize를 하는것만으로는 부족하다transient 와 readResolve 를 구현하여 역직렬화떄 새로운 인스턴스가 생성되더라도 싱글턴 인스턴스를 전달한다새로운 인스턴스는 GC에 의해 unreachable로 판별되어 제거된다.

 

readResolve?자바 직렬화, 역직렬화떄는 readResolve, writeResolve가 사용된다.해당 readResolve는 직렬화, 역직렬화할떄 인스턴스를 리턴해주는데, 이때 싱글턴 인스턴스를 리턴하게 해주면직렬화떄 신규로 생성되는 인스턴스에 대한 방지를 할 수 있다.

 

enum 선언직렬화 역직렬화, 리플렉션에 대한 공격으로 싱글턴 인스턴스 외 생성될 인스턴스 방어를 신경쓰지 않아도된다.사용법은 간결하고, 인스턴스가 추가로 생성될 가능성을 차단시킨다.

 

만약에 싱글턴이 다른 클래스를 상속받아야 할 때는 이방법을 사용할 수 없다.

 

반응형