아이템 3 private 생성자나 열거 타입으로 싱글턴임을 보증하라
싱글턴(Singleton) = 인스턴스를 오직 하나만 생성할 수 있는 클래스
필드로 선언된 정적 인스턴스
public class Elvis {
public static final Elvis INSTANCE = new Elvis(); // 정적 필드로 유일한 인스턴스를 선언
private Elvis() { } // 생성자는 private로 설정
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE; // 정적 필드를 통해 인스턴스를 사용
elvis.leaveTheBuilding();
}
}
private 생성자를 사용하여 외부에서 인스턴스를 생성할 수 없도록 하고, 정적 필드인 INSTANCE를 통해 유일한 인스턴스를 제공한다. 정적 필드가 클래스 로딩 시 초기화되므로 스레드 안전(Thread-Safety)하다. 간결하고 직관적인 구현이다.
정적 팩토리 메서드
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { } // 생성자는 private로 선언하여 외부에서 인스턴스를 생성할 수 없도록 함.
public static Elvis getInstance() {
return INSTANCE; // 정적 메서드를 통해 유일한 인스턴스를 반환
}
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
public static void main(String[] args) {
Elvis elvis = Elvis.getInstance();
elvis.leaveTheBuilding(); // 인스턴스를 통해 메서드 호출
}
}
private 생성자를 사용하여 외부에서 인스턴스를 생성하지 못하게 하고, 정적 메서드인 getInstance()를 통해 유일한 인스턴스를 반환한다. 스레드 안전(Thread-Safety)하고, 여러 클래스 로딩 상황에서도 인스턴스가 하나로 유지된다.
열거형 싱글턴
public enum Elvis {
INSTANCE; // 열거형으로 유일한 인스턴스를 선언
public void leaveTheBuilding() {
System.out.println("기다려 자기야, 지금 나갈께!");
}
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE; // 열거형으로 인스턴스 사용
elvis.leaveTheBuilding();
}
}
이 방법은 Java의 열거형을 사용하여 싱글턴을 구현한 것이다. INSTANCE는 유일한 인스턴스이며, 이 방식은 기본적으로 스레드 안전하며 직렬화의 이점도 가진다. 열거형을 사용하면 싱글턴의 인스턴스가 항상 유일하다는 것을 보장하고, 쉽게 직렬화할 수 있는 장점이 있다.
- 정적 팩토리 메서드: 인스턴스를 반환하는 메서드를 통해 싱글턴을 구현.
- 정적 필드: 클래스 로딩 시 정적 필드로 인스턴스를 초기화. 간단하고 효과적.
- 열거형: Java의 열거형을 활용하여 싱글턴을 구현. 스레드 안전성과 직렬화 장점을 제공.
각 방법마다 장단점이 있지만, 열거형을 사용하는 방식이 가장 안전하고 간단한 방법으로 추천되기도 한다.
'Java' 카테고리의 다른 글
이펙티브 자바(Effective Java) 2장 - 아이템 6 불필요한 객체 생성을 피하라 (0) | 2024.12.03 |
---|---|
이펙티브 자바(Effective Java) 2장 - 아이템 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 4 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 2 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 1 생성자 대신 정적 팩터리 메서드를 고려하라 (1) | 2024.12.03 |