728x90
이전에 작성했던 이펙티브 자바 아이템 3: 싱글턴 보증 방법 정리에서 제대로 이해하지 못했던 부분이 있었다.
바로 정적 팩토리 메소드 방식으로 싱글턴을 만드는 방법에서 장점으로 존재했던, API를 변경하지 않고도 싱글턴이 아니게 변경할 수 있다는 부분이었다.
API를 변경하지 않고 싱글턴이 아니게 변경할 수 있다는 것을 코드를 예시로 들어 작성하면 다음과 같다.
이전에 작성했던 정적 팩토리 메소드 방식의 싱글턴 인스턴스를 얻는 방법이다.
public class YongCoding{
// 인스턴스를 얻기 위해서는 정적 팩토리 메소드를 이용해야한다.
private static final YongCoding INSTANCE = new YongCoding();
// private 생성자
private YongCoding(){
// 생략!
}
// 정적 팩토리 메소드 방식으로 싱글턴 객체 얻기
public static YongCoding getInstance(){
return INSTANCE;
}
}
그러나 프로그램의 다음 버전에서 해당 클래스가 싱글턴을 반환하는 것이 아니라 새로운 객체를 생성해서 반환하기로 결정됐다면, 정적 팩토리 메소드 방식은 아래와 같이 코드를 수정할 수 있다.
public class YongCoding{
// 인스턴스를 얻기 위해서는 정적 팩토리 메소드를 이용해야한다.
private static final YongCoding INSTANCE = new YongCoding();
// private 생성자
private YongCoding(){
// 생략!
}
// 정적 팩토리 메소드 방식으로 싱글턴 객체 얻기
public static YongCoding getInstance(){
return new YongCoding(); // 변경 부분
}
}
기존에 인스턴스를 얻는데 사용했던 getInstance() 정적 팩토리 메소드는 더이상 같은 인스턴스를 반환하는 것이 아니라 새로운 객체를 생성해서 반환하게 변경했다.
그렇다면 기존에 YongCoding 클래스를 이용했던 다른 클래스들은 어떻게 될까?
// 시그니쳐의 변경이 없다.
// 클라이언트는 이 코드가 싱글턴인지 새로운 객체를 생성해서 반환하는지 상관없이 그대로 사용해도 아무 문제가 없다.
YongCoding.getInstance();
짠~ 아무 문제 없이 그대로 사용할 수 있다.
이런 특징이 바로 정적 팩토리 메소드 방식으로 싱글턴 객체를 반환할 때 API의 변경없이 싱글턴이 아니게 변경할 수 있다는 것이다.
그럼 정리는 여기서 끝!
728x90
반응형
'개발 > 자바' 카테고리의 다른 글
| QueryDsl 설정 (인텔리제이, maven) (1) | 2022.04.05 |
|---|