Dev/JAVA

[Effective JAVA] private 생성자나 열거타입으로 싱글턴임을 보증하라. ( 아이템 3 )

록흐 2024. 3. 20. 22:24
반응형

 

싱글턴 객체를 만드는 방식을 둘 중 하나이다. 

 

1) 필드 멤버

모든 생성자를 private으로 감추어 객체 생성을 불가능하게 만들고, public static final로 선언된 멤버만 외부로 노출한다. 

 

권한이 있는 클라이언트는 reflection으로 private 생성자를 호출하여 객체를 생성할 수 있으나, 두 번째 객체가 생성될 때 예외를 발생시키는 것으로 방지할 수 있다. 

 

2) 정적 팩터리 

private static final로 선언된 멤버변수에 객체를 생성하고 정적 메소드로만 해당 상수를 return하는 방식이다. 

 

정적 팩터리 방식은 정적 메소드를 이용한 방식이다. 

 

장점1)

싱글톤 객체는 final로 선언된 변수를 참조하므로, 동적으로 테스트가 쉽지 않다.  메소드 로직으로 스레드 종류에 따라 다른 인스턴스를 반환하게 하도록 구현할 수 있어 테스트에 용이하다. 

 

장점2)

제네릭을 사용하여 다양한 싱글톤 인스턴스를 반환할 수 있다. 

 

장점3) 

인스턴스를 return하는 메소드이므로, 메서드 참조를 이용하면 파라미터로의 인자로 던질 수 있다. 

public class Concert {
    // 공급자 Supplier (FunctionalInterface)
    public void start(Supplier<Singer> singerSupplier) {
        Singer singer = singerSupplier.get();
        singer.sing();
    }

    public static void main(String[] args) {
        Concert concert = new Concert();
        // T get();
        // getInstance()를 전달가능 : 인스턴스를 리턴하기 때문에 인자로 전달 가능
        concert.start(Elvis::getInstance);
    }
}

 

 

3) 열거타입 방식 ( 가장 바람직한 방법 )

 

원소가 하나뿐인 열거타입을 만드는 것이 싱글턴을 만드는 가장 좋은 방법이다. 

 

1), 2)는 직렬화에 문제가 직렬화 과정에서 문제가 생긴다. enum은 public 필드 방식과 비슷하지만 간결하고 직렬화에도 좋고 리플렉션에도 자유롭다. 상속이 필요한 클래스의 싱글톤 객체가 아닌 이상 enum이 가장 좋은 방식이다. 

 

 

반응형