본문 바로가기
public void static main()/Book

[Effective Java] 아이템 35

by 햄리뮤 2023. 1. 30.
반응형

으아ㅏㅏ

[책 규칙]

노란색 - 자세히 알아보고싶은 부분

초록색 - 핵심 개념 (블로그 정리시는 검은색으로!)

빨간색 - 무슨말인지 모르겠는 부분

[아이템 35] ordinal 메서드 대신 인스턴스 필드를 사용하라

ordinal 메서드?

  • 전체 중에 해당 열거 객체가 몇번째 인지 알려준다! 순서는 0번부터 시작!
  • 모든 열거 타입이 이를 제공한다!

열거 타입 상수와 연결된 정숫값이 필요하면 ordinal 메서드를 이용하려 한다! STOP!

// ordinal을 잘못 사용한 예
public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET, QUINTET,
    SEXTET, SETPTET, OCTET, NONET, DECTET;

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

왜 이렇게 쓰면 안될까??

  • 상수 선언 순서를 바꾸는 순간 위 numberOfMusicians()는 제대로 동작하지 않는다!
  • 이미 사용 중인 정수와 값이 같은 상수는 추가할 수 없다.
  • 값을 중간에 비워둘 수 없다!
  • dummy 상수를 맘ㄶ이 추가해야 하는 상황이 생길 수 잇으며 이는 코드를 지저분하게 만든다!

해결 방법은?

  • 열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고 인스턴스 필드에 저장하자!
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 }
}

Enum의 AIP 문서를 보면 ordinal에 대해 이렇게 쓰여있다. 요약하자면 아래와 같은 용도가 아니면 가급적 ordinal 메서드는 절대 사용하지 말자!

대부분 프로그래머는 이 메서드를 쓸 일이 없다. 이 메서드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다.

 

 

오늘은 간단히 정리해보았다!

읽어줘서 감사하다!

 

반응형

댓글