Handler
Handler
handler
관련 글 : enum
문제
기존 enum 값에서 값을 변경하는 과정에서 문제가 발생했다.
1
2
3
4
5
6
7
8
9
10
@Getter
@AllArgsConstructor
public enum User {
Y("A", "정답"),
N("B", "오답");
private final String classNumber;
private final String name;
}
Handler 로직 작성
enum 값을 문자열과 비교하기 위해 handler를 작성했다.
1
2
3
4
5
6
7
8
9
// 일부 생략
return Arrays.stream(User.values())
.filter(User ->
User.getClassNumber().equals(string)
|| User.name().equals(string)
)
.findFirst()
.orElse(null);
}
이 상태에서는 정상적으로 동작했다.
문제 발생
문제 코드
1
User.getName().equals(string)
반면 아래 코드는 정상 동작한다.
1
User.name().equals(string)
test
enum 필드 이름 name을 la로 변경해서 테스트했다.
1
2
3
4
5
6
7
8
9
10
@Getter
@AllArgsConstructor
public enum User {
Y("A", "정답"),
N("B", "오답");
private final String classNumber;
private final String la;
}
원인
enum의 name() 메서드
enum에는 기본으로 제공되는 메서드가 있다.
- name()
- toString()
이 메서드들은 enum 상수에 정의된 이름을 그대로 반환한다.
User.Y.name()→ “Y”User.N.name()→ “N”
🔽
name()→ enum 상수 이름getName()→ enum 필드 값 (“정답”, “오답”)
문제
1
2
User.name() → enum 상수 이름 (Y, N)
User.getName() → enum 필드 값 ("정답", "오답")
여기서 문제는 필드 이름을 name으로 정의했기 때문이다.
enum이 기본으로 제공하는 name() 메서드와
내가 정의한 name 필드가 충돌한다.
결론
- enum에서는
name()이라는 메서드가 이미 존재 - 상수 이름 비교 →
name() - 의미 값 비교 →
get필드명()
enum 필드명으로 name 사용 ❌
1
2
3
4
5
6
7
8
9
10
@Getter
@AllArgsConstructor
public enum User {
Y("A", "정답"),
N("B", "오답");
private final String classNumber;
private final String label;
}
REFERENCE
This post is licensed under CC BY 4.0 by the author.