티스토리 뷰

Java

[Java] Enum Singleton Pattern

snail voyager 2023. 12. 27. 20:31
728x90
반응형

Enum 특징

  • JVM에서 인스턴스를 단 한 번만 생성하기 때문에 인스턴스의 제어가 용이
  • Enum 상수가 프로그램 내에서 오직 한 번만 생성되고, 그 이후에는 항상 동일한 인스턴스를 참조
  • JVM에서 스레드 안전(thread-safe)하게 초기화
  • 자동으로 직렬화되며, 역직렬화될 때도 항상 동일한 인스턴스를 반환

Enum Singleton Pattern

Enum의 특징을 활용해서 각 Enum 상수에 대해 특정 비즈니스 객체를 생성하도록 코드를 작성해서 

싱글톤으로 생성된 비즈니스 객체를 재사용할 수 있도록 구현한다.

구현 객체 생성을 Enum에 위임해서 Client에서는 Interface를 통해서 사용할 수 있다.

 

Calculator enum에 비즈니스 객체를 생성하는 요소

public enum Calculator {
    ADD(1, AdditionOperation::new),     //ENUM 상수에서 생성되는 객체도 싱글톤
    SUBTRACT(2, SubtractionOperation::new),
    MULTIPLY(3, MultiplicationOperation::new),
    DIVIDE(4, DivisionOperation::new);

    private final int code;
    private final Operation operation;

    Calculator(int code, Supplier<Operation> operationSupplier) {
        this.code = code;
        this.operation = operationSupplier.get();
    }

    public Operation getOperation() {   //ENUM 상수에서 생성된 객체를 얻기
        return operation;
    }

    static public Optional<Calculator> getCalculatorByCode(int code) {
        return Arrays.stream(values())
                .filter(x -> x.code == code)
                .findAny();
    }
}

Operation interface와 비즈니스 역할의 구현 객체

interface Operation {
    void performOperation(String rawTemplate);
}

public class AdditionOperation implements Operation {
    @Override
    public void performOperation(String rawTemplate) {
        System.out.println("Performing addition operation");
        processFirst(rawTemplate);
    }

    private void processFirst(String rawTemplate) {
        System.out.println("processing first..." + rawTemplate);
    }
}

public class SubtractionOperation implements Operation {
    @Override
    public void performOperation(String rawTemplate) {
        System.out.println("Performing subtraction operation");
    }
}

public class MultiplicationOperation implements Operation {
    @Override
    public void performOperation(String rawTemplate) {
        System.out.println("Performing multiplication operation");
    }
}

public class DivisionOperation implements Operation {
    @Override
    public void performOperation(String rawTemplate) {
        System.out.println("Performing division operation");
    }
}

Client에서 사용하는 예시

public class EnumSingletonMain {
    public static void main(String[] args) {
        final String rawTemplate = "Json Data...";
        final int code = 1;
        Calculator.getCalculatorByCode(code).ifPresent(x -> x.getOperation().performOperation(rawTemplate));

        final String rawTemplate2 = "Json Data2...";
        final int code2 = 2;
        Calculator.getCalculatorByCode(code2).ifPresent(x -> x.getOperation().performOperation(rawTemplate2));

        final String rawTemplate3 = "Json Data3...";
        Calculator.getCalculatorByCode(code).ifPresent(x -> x.getOperation().performOperation(rawTemplate3));
    }
}

 

 

 

 

 

728x90
반응형

'Java' 카테고리의 다른 글

[Java] List.of vs Arrays.asList  (1) 2024.02.11
[Java] CPU 와 ThreadPool Size 결정 방법  (0) 2024.01.29
[Java] 기본적인 리팩터링  (0) 2023.12.16
[Java] 리팩터링 테스트  (0) 2023.12.16
[Java] 리팩터링 원칙  (0) 2023.12.03
반응형
300x250