💻문제점
Enum 값에 숫자 값을 넣어주기 위해 다음과 같이 setCalorie()를 선언했다.
문제는, OVER_INTAKE 밖에 사용되지 않는 메서드이기 때문에, 그 외에는 Enum의 message만 반환하는 점이 어색함이 많았다.
NotificationMessage.java
@Getter
public enum NotificationMessage {
// sse
SSE_CONNECTION("SSE 연결이 완료되었습니다."),
// intake
OVER_INTAKE("오늘의 칼로리 섭취량이 %dKcal 초과되었습니다.");
private final String message;
NotificationMessage(String message) {
this.message = message;
}
public String setCalorie(int calorie) {
if (this == OVER_INTAKE) {
return String.format(this.message, calorie);
}
return this.message;
}
📃시도
처음에는 인터페이스를 사용해서 오버라이딩을 하려고 했었다.
MessageFormatter.java
public interface MessageFormatter {
String getMessage(int data);
}
NotificationMessage.java
@Getter
public enum NotificationMessage implements MessageFormatter {
// sse
SSE_CONNECTION("SSE 연결이 완료되었습니다.") {
@Override
public String getMessage(int data) {
return null;
}
},
// intake
OVER_INTAKE("오늘의 칼로리 섭취량이 %dKcal 초과되었습니다.") {
@Override
public String getMessage(int calorie) {
return String.format(this.getMessage(), calorie);
}
};
private final String message;
NotificationMessage(String message) {
this.message = message;
}
}
이 경우에는 OVER_INTAKE를 getMessage(int ..)로 가져올 때 값을 설정해줄 수 있지만, SSE_CONNECTION이 불필요한 메서드의 오버라이딩을 하게된다는 문제점이 있다.
🔍해결
인터페이스는 default 키워드를 사용해 메서드를 정의할 수 있다.
이 경우에는 인터페이스에서 구현 내용도 함께 작성할 수 있다.
MessageFormatter.java
public interface MessageFormatter {
default String getMessage() {
return "";
}
default String getMessage(int data) {
return getMessage();
}
}
NotificationMessage.java
public enum NotificationMessage implements MessageFormatter {
// sse
SSE_CONNECTION("SSE 연결이 완료되었습니다."),
// intake
OVER_INTAKE("오늘의 칼로리 섭취량이 %dKcal 초과되었습니다.") {
@Override
public String getMessage(int calorie) {
return String.format(this.getMessage(), calorie);
}
};
private final String message;
NotificationMessage(String message) {
this.message = message;
}
@Override
public String getMessage() {
return this.message;
}
}
NotificationMessage에서는 @Getter를 제거하고, 인터페이스의 getMessage()를 오버라이딩하도록 변경했다.
default로 getMessage(int data)를 선언했기 때문에, SSE_CONNECTION에서 해당 메서드를 오버라이딩할 필요가 없다.
인터페이스를 사용하여 확장성 있는 Enum 클래스를 정의할 수 있었다!
728x90
'TIL' 카테고리의 다른 글
[TIL - 20240110] 컨트롤러 나누기?! (0) | 2024.01.10 |
---|---|
[TIL - 20240103] Spring Data JPA @Modifying 문제 (0) | 2024.01.03 |
[TIL - 20231226] jacoco 패키지, 클래스 Report에서 제외 (0) | 2023.12.26 |
[TIL - 20231222] AuthenticationEntryPoint를 사용한 JWT 예외 핸들링 (1) | 2023.12.22 |
[TIL - 20231222] searchWeeklyIntakeCalories 로직 개선 (0) | 2023.12.22 |