Back-end/Java
Enum 사용 중 Attribute value must be constant 발생
HOONY_612
2024. 2. 5. 20:25
반응형
개요
업무 중 Worker 구조를 Annotation 기반으로 변경하는 부분에서 아래와 같은 부분이 있었다.
@WorkerTask(value = "externaldb-task", threadCount = 10)
value의 String을 Enum의 속성으로 대체하려했다. 그러나 컴파일 에러가 발생했다.
public enum TaskDefinitionNames {
EXTERNAL_DB_TASK("externaldb-task"),
...
public String getNameValue() {
return nameValue;
}
}
메세지는 "Attribute value must be constant" 였다. 이유가 뭘까?
이유
TaskDefinitionNames.EXTERNAL_DB_TASK.getNameValue() 가 동작하지 않는다.
어노테이션은 컴파일 타임에 정해진다. 그러다보니 나중에 결정되는 런타임 시점의 값들은 들어가면 안된다.
getNameValue는 런타임에 호출된다는 것이다. TaskDefinitionNames.EXTERNAL_DB_TASK 는 괜찮아도 TaskDefinitionNames.EXTERNAL_DB_TASK.getNameValue()는 안된다는 것이다.
해결
1. Constants Class 이용하여 상수화
현재 Enum에서 작성한 요소는 Taskname:String 만 있다.
Enum의 Nested Class로 만드는 경우 아래와 같은 상황이 발생한다.
만약 static import로 사용해도 헷갈린다.
...
TaskDefinitionNames.TaskNameConstants.EXTERNAL_DB_TASK
...
그래서 굳이 Enum Class를 사용하지 않는게 좋다고 판단했다.
아래의 상수 클래스를 만들어 해결했다.
public class TaskNameConstants {
public static final EXTERNAL_DB_QUERY_TASK = "externaldb-task";
...
}
만약 사용되는 변수들이 클래스 내부에서만 사용된다면 상수로 선언하고 클래스를 만들 필요는 없다.
반응형