HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[Item 35] ordinal 메서드의 사용 목적 #35

Closed zpqmdh closed 1 month ago

zpqmdh commented 1 month ago

모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지 반환하는 ordinal 이라는 메서드를 제공합니다. 하지만, 여러 문제점 때문에 프로그래머가 이 메서드를 직접 사용할 일은 없다고 책 221페이지에서 언급하고 있습니다.

ordinal 메서드를 EnumSetEnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다고 하는데, 열거 타입 기반의 범용 자료구조에서 어떻게 ordinal 메서드를 사용하고 있는지 예시를 들어주실 수 있나요?

ForteEscape commented 1 month ago

Q.

ordinal 메서드를 EnumSet 과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다고 하는데, 열거 타입 기반의 범용 자료구조에서 어떻게 ordinal 메서드를 사용하고 있는지 예시를 들어주실 수 있나요?

A. 아래는 EnumSet의 구현체인 JumboEnumSet의 구현 코드 일부입니다.

void addRange(E from, E to) {
    int fromIndex = from.ordinal() >>> 6;
    int toIndex = to.ordinal() >>> 6;

    if (fromIndex == toIndex) {
        elements[fromIndex] = (-1L >>>  (from.ordinal() - to.ordinal() - 1))
                        << from.ordinal();
    } else {
       elements[fromIndex] = (-1L << from.ordinal());
       for (int i = fromIndex + 1; i < toIndex; i++)
            elements[i] = -1;
        elements[toIndex] = -1L >>> (63 - to.ordinal());
    }
    size = to.ordinal() - from.ordinal() + 1;
}