클래스를 싱글톤으로 만들면 테스트가 어렵습니다. 해당 싱글톤 클래스가 어떤 인터페이스를 구현하고 있지 않은 이상 Mock 구현체로 대체하기 어렵기 때문입니다.
Java 1.5버전 전에는 싱글톤 구현에 2가지 방법이 있었습니다. 두가지 모두 private 생성자를 기반으로 public static member를 노출시키는 전략이었습니다.
첫번째 방법은 public static final field를 노출하는 것입니다.
두번째 방법은 private static final field를 가지고 getInstance 메소드를 통해서 싱글톤 객체에 접근하는 것입니다.
세번째로 Java 1.5 버전 이후에는 Enum을 활용하여 간결하고 java reflection이나 serialization에 영향을 받지 않는 싱글톤 클래스를 생성하는 방법을 추천합니다.
public class Item3 { public static final Item3 INSTANCE = new Item3(); private Item3() {} public void method() {} } // second approach: static factory method // - advantage: You can change your mind // whether the class should be a singleton without changing API class Item3_2 { private static final Item3_2 INSTANCE = new Item3_2(); private Item3_2() {} public Item3_2 getInstance() { return INSTANCE; } public void method() {} } // After 1.5 third approach to implementing singletons // A single-element enum type // - advantage1: concise // - advantage2: serialization machinery for free // - advantage3: ironclad guarantee against multiple instantiation, // even in the face of sophisticated serialization and reflection attack enum Item3_3 { INSTANCE; //private Item3_3() {} public void method() { System.out.println("Item3_3"); } }
댓글 없음:
댓글 쓰기