americano_people 2023. 1. 7. 11:48

Enum의 장점

public enum PizzaStatus {
    ORDERED,
    READY, 
    DELIVERED; 
}

Enum의 장점은 다음과 같다.

  • 코드의 가독성을 높여준다.
  • 허용하는 값의 목록을 문서화한다.
  • 잘못된 값이 전달되는 문제를 줄일 수 있다.
  • 실수를 줄여준다. 

Enum 비교하기 

Enum은 ==, equals 함수로 비교할 수 있다. Enum은 JVM 에 한 개의 인스턴스만 생성되기 때문에 모든 Enum 객체는 동일한 주소값을 갖는다.

testPz.getStatus().equals(Pizza.PizzaStatus.DELIVERED); 
testPz.getStatus() == Pizza.PizzaStatus.DELIVERED;

 

Enum 활용하기

(1) Enum에 함수 추가하기 

public enum PizzaStatus {
    ORDERED(5) {
        @Override
        public boolean isOrdered() {
            return true;
        }
    },
    READY(2) {
        @Override
        public boolean isReady() {
            return true;
        }
    },
    DELIVERED(0) {
        @Override
        public boolean isDelivered() {
            return true;
        }
    };

    private int timeToDelivery;

    public boolean isOrdered() {
        return false;
    }

    public boolean isReady() {
        return false;
    }

    public boolean isDelivered() {
        return false;
    }

    public int getTimeToDelivery() {
        return timeToDelivery;
    }

    PizzaStatus(int timeToDelivery) {
        this.timeToDelivery = timeToDelivery;
    }
}

(2) Enum 목록 관리하기 

EnumSet을 사용하여 Enum의 값 집합에 의미를 부여할 수 있다. 

EnumSet <PizzaStatus> undeliveredPizzaStatuses = EnumSet.of(PizzaStatus.ORDERED, PizzaStatus.READY);
undeliveredPizzaStatuses.contains(s.getStatus())

 

public class Pizza {

    private static EnumSet<PizzaStatus> undeliveredPizzaStatuses =
      EnumSet.of(PizzaStatus.ORDERED, PizzaStatus.READY);

    private PizzaStatus status;

    public boolean isDeliverable() {
        return this.status.isReady();
    }

    public void printTimeToDeliver() {
        System.out.println("Time to delivery is " + 
          this.getStatus().getTimeToDelivery() + " days");
    }

    public static List<Pizza> getAllUndeliveredPizzas(List<Pizza> input) {
        return input.stream().filter(
          (s) -> undeliveredPizzaStatuses.contains(s.getStatus()))
            .collect(Collectors.toList());
    }

    public void deliver() { 
        if (isDeliverable()) { 
            PizzaDeliverySystemConfiguration.getInstance().getDeliveryStrategy()
              .deliver(this); 
            this.setStatus(PizzaStatus.DELIVERED); 
        } 
    }
   
}

(3) Strategy Patteren 적용하기 

Enum을 사용하여 Strategy Pattern을 구현하면, 타입마다 다른 로직을 타는 로직을 쉽게 구현할 수 있다. 

 

public enum PizzaDeliveryStrategy {
    EXPRESS {
        @Override
        public void deliver(Pizza pz) {
            System.out.println("Pizza will be delivered in express mode");
        }
    },
    NORMAL {
        @Override
        public void deliver(Pizza pz) {
            System.out.println("Pizza will be delivered in normal mode");
        }
    };

    public abstract void deliver(Pizza pz);
}
public void deliver() {
    if (isDeliverable()) {
        PizzaDeliverySystemConfiguration.getInstance().getDeliveryStrategy()
          .deliver(this);
        this.setStatus(PizzaStatus.DELIVERED);
    }
}

 

 

참고

https://www.baeldung.com/a-guide-to-java-enums#representation

https://techblog.woowahan.com/2527/