Java에서 enum을 사용할 때, 부모-자식 클래스의 관계 처럼 연관관계를 만들 수 있을까?
enum은 암묵적으로 java.lang.Enum을 상속받기 때문에, 다중상속은 불가능하므로 다른 클래스를 상속받을 수는 없다.
하지만 인터페이스를 implements 한다면 가능하다.
프로젝트에 적용한 예시를 살펴보자.
멀티모듈 프로젝트에서 각 모듈별로 사용하는 에러코드를 공유하기 위해 BaseErrorCode라는 인터페이스를 만들고,
각 모듈별 에러코드 enum이 BaseErrorCode를 implements하여 모듈간 에러코드를 공유할 수 있도록 작성하였다.
이러한 접근 방식의 장점은 각 모듈이 독립적으로 에러코드를 관리할 수 있으면서도, 공통된 인터페이스를 통해 일관성을 유지할 수 있다는 점이다.
BaseErrorCode.java
public interface BaseErrorCode {
ErrorResponse getErrorResponse();
String getMessage();
HttpStatus getStatus();
}
MemberErrorCode.java
@Getter
public enum MemberErrorCode implements BaseErrorCode {
// ADMIN
ADMIN_NOT_FOUND("NOT FOUND", HttpStatus.NOT_FOUND, "존재하지 않는 관리자입니다."),
...
private final String errorCode;
private final HttpStatus status;
private final String message;
MemberErrorCode(String errorCode, HttpStatus status, String message) {
this.errorCode = errorCode;
this.status = status;
this.message = message;
}
@Override
public ErrorResponse getErrorResponse() {
return new ErrorResponse(errorCode, message);
}
}
BaseErrorCode를 변수로 가지는 커스텀 Exception 클래스를 만들면 BaseErrorCode의 enum구현체를 프로젝트 전반에 걸쳐 공유하여 사용할 수 있다.
@Getter
public class MemberCustomException extends RuntimeException {
private final BaseErrorCode errorCode;
public MemberCustomException(BaseErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
}
}