얼마전 업무를 진행하다 enum field에
private final List<String> labels;
다음과 같이 추가하고
EMPTY(
999,
"",
new ArrayList<>()
);
이런 enum을 추가하였다.
특정 조건에 맞는 label List를 상황에 따라 내려주고 싶어서 if 문과 add method로 enum field에 직접 넣었는데 계속적으로 List에 항목이 더해지는 현상이 발생했다.
List<String> labels = TestEnum.EMPTY.getLabels();
labels.add("테스트")
TestEnum.EMPTY.getLabels() = ["테스트", "테스트", 테스트", ...]
원인을 알아본 결과 enum은 언제나 항상 field에 static이 암묵적으로 선언된 상태였고 코드를 다음과 같이 선언한 결과 원하는 결과를 얻을 수 있었다.
List<String> labels = TestEnum.EMPTY.getLabels();
this.labels = new ArrayList<>(labels);
this.labels.add("테스트);
아마 생각하건데 Enum 또한 Class의 한 종류기 때문에 로딩될 때 Method Area에 올라가고, Enum의 인스턴스를 생성해서 호출하는 것이 아닌 직접 Enum에서 항목을 불러오기 때문에 field가 static인 것 같다.
https://stackoverflow.com/questions/23127926/static-enum-vs-non-static-enum
스택 오버플로우는 언제나 옳다!