장점
public class Elvis {
public static final Elvis INSTANCE = new Elvis(); // 싱글톤
private Elvis() {}
public void leaveTheBuilding() {
System.out.println("leave the building");
}
}
public class ReflectionTest {
public static void main(String[] args) {
try {
Constructor<Elvis> constructor = Elvis.class.getDeclaredConstructor();
defaultConstructor.setAccessible(true); // private 접근 허용
Elvis elvis1 = constructor.newInstance();
Elvis elvis2 = constructor.newInstance();
System.out.println(elvis1);
System.out.println(elvis2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
주소가 다른 것을 확인 할 수 있다.
리플렉션 API를 통한 인스턴스 생성을 막으려면 생성자를 수정하여 두번째 객체가 생성되려 할 때 예외를 던지게 하면 된다.
public class Elvis {
public static final Elvis INSTANCE = new Elvis(); // 싱글톤
private static boolean created; // 생성 여부 판단
private Elvis() {
// 이미 생성된 경우 예외 발생
if(create) throw new RuntimeException("Instance already exists.")
create = true;
}
public void leaveTheBuilding() {
System.out.println("leave the building");
}
}
public class Elvis implements Serializable {
public static final Elvis INSTANCE = new Elvis(); // 싱글톤
private static boolean created; // 생성 여부 판단
private Elvis() {
// 이미 생성된 경우 예외 발생
if(create) throw new RuntimeException("Instance already exists.")
create = true;
}
public void leaveTheBuilding() {
System.out.println("leave the building");
}
@Serial
private Object readResolve() {
return INSTANCE;
}
}
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() {
System.out.println("leave the building");
}
}
장점
public static Elvis getInstance() { return new Elvis; }
public class Elvis<T> {
private static final Elvis<Object> INSTANCE = new Elvis<>();
private Elvis() { }
public static <T> Elvis<T> getInstance() { return (Elvis<T>) INSTANCE; }
public void leaveTheBuilding() {
System.out.println("leave the building");
}
}
Supplier<Elvis> supplier = Elvis::getInstance;
장점
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() {
System.out.println("leave the building");
}
}
public interface IElvis {
void leaveTheBuilding();
}
public class Elvis implement IElvis {
public static final Elvis INSTANCE = new Elvis(); // 싱글톤
private Elvis() {}
@Override
public void leaveTheBuilding() {
System.out.println("leave the building");
}
}
public class MockElvis implement IElvis {
@Override
public void leaveTheBuilding() {
System.out.println("Mock leave the building");
}
}