소프트웨어-이야기/프로그래밍 언어와 프레임워크
Enum 활용하기
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