JAVA/Effective Java

객체의 생성과 삭제 - 규칙 3 private 생성자나 enum 자료형은 싱글톤 패턴을 따르도록 설계하라.

반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package practice;
 
public class SingleTone {
public static SingleTone INSTANCE;
 
public static synchronized SingleTone getInstance() {
if ( INSTANCE == null ) {
INSTANCE = new SingleTone();
}
return INSTANCE;
}
 
private SingleTone() {}
}
cs




기존에 싱글톤 패턴을 사용할 때 다음과 같이 생성해 주었다.
 
하지만 이런 형태로 만들 시 private 생성자를 생성하였다 해도 java reflection 성질을 이용하여 객체를 생성 할 수있다.

그리고 INSTANCE 객체가 null일때 인스턴스 객체 생성을 위해서 synchronized를 해주어야 하고 신경써야 할 부분이 많아 번거롭다.
 
이런 단점을 해소하고 오직 하나의 객체만을 안전하게 공유하여 사용할 수 있도록 
 
하기 위해서는 
JDK 1.5에서 부터는 원소가 하나 뿐인 enum 자료형을 생성하여 사용하기를 권장한다.
 

이렇게 지정하여 싱글톤 패턴을 정의하였을 때 다음과 같은 장점을 얻을 수 있다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package practice;
 
 public enum SingleToneEnum {
  INSTANCE;
  private int age;
 
  public int getAge() {
   age = age + 1;
   return age;
  }
}
 
 
package practice;
 
public class practice {
 public static void main(String args[]) {
  System.out.println(SingleToneEnum.INSTANCE.getAge());
 }
}
cs



 - INSTANCE 가 생성될 때, multi thread 로 부터 안전하다.
 - 단 한번의 인스턴스 생성을 보장한다.
 - reflection으로 부터 접근을 막을 수 있다.

출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙3 인용.



반응형