티스토리 뷰
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