Post

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 필드 이름 namela로 변경해서 테스트했다.

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.