본문 바로가기
☕️ JAVA/🦋 Effective Java

자바 enum에서 ordinal 메서드 사용하지마...(세요) 🚫

by kukim 2022. 1. 21.

이 글은 책 이펙티브 자바 3판 Item35와 하단 Reference 참고했습니다. 잘못된 내용이 있다면 편하게 말씀해주세요 🙏🏻

 

한 줄 요약

enum에서 ordinal 메서드 사용하지 말고 인스턴스 필드를 써라


enum 클래스에 기본 내장으로 ordinal() 메서드가 있다. 해당 상수가 열거 타입의 몇 번째 위치진이 반환하는 메서드이다. 아래 Esenmble enum에서 순서는 SOLO, DUET, TRIO... 순으로 oridinal()은 0, 1, 2... 순으로 결과가 나온다. numberOfMusicians() 메서드는 이 결과에 +1 하여 리턴하니 1,2,3,4,5... 순서의 값으로 나온다.

enum Esenmble {
    SOLO, DUET, TRIO, QUARTET, QUINTET,
    SEXTET, SETPTET, OCTET, NONET, DECTET;

    public int numberOfMusicians() {
        return ordinal() + 1;
    }
}

하지만 이 메서드는 사용하면 안된다. 왜 그럴까?

 

문제점

  • 열거 타입 순서를 지키면서 정의해야 한다.
  • 같은 수는 여러 개 선언할 수 없다.

 

그렇다면 어떻게 해야 할까?

 

해결법

  • 인스턴스 필드로 값을 지정, 저장하여 사용하자. oridinal() 메서드의 문제점을 피할 수 있다.
public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
    SEXTET(6), SETPTET(7), OCTET(8), NONET(9), DECTET(10);

    private final int numberOfMusicians;
    Ensemble(int size) { this.numberOfMusicians = size }
    public int numberOfMusicians() { return numberOfMusicians }
}

 

+a) oridinal() 메서드의 JDK 11 Java doc 내용

Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero). Most programmers will have no use for this method. It is designed for use by sophisticated enum-based data structures, such as java.util.EnumSet and java.util.EnumMap.

대부분의 프로그래머는 이 메서드를 사용하지 않는다. EnumSet이나 EnumMap에서 사용하기 위해 만들어진 메서드이다.

 

공식 문서에서 특별한 용도를 제외하고 사용하지 말라니 쓰지 말아야겠다.

 


⛓ Reference

쿠킴 - 자바의 'enum'과 'lambda'를 클래스로 이해해보기 🔎

이펙티브 자바 3판 - item 35

 

댓글