본문 바로가기

STUDY/이펙티브자바

6-2) ordinal 메소드 대신 인스턴스 필드를 사용하라

ordinal 사용한 예

 

public enum Ensemble {
    SOLO, DUET, TRIO, QUARTET, QUINTET,
    SEXTET, SEPTET, OCTETE, NONET, DECTET;
	
    public int numberOfMusicians() {
        return this.ordinal() + 1;
    }
}

enum에는 해당 상수사 몇 번째 위치인지를 반환하는 ordinal이라는 메소드가 존재한다. 그리고 개발자는 해당 메소드를 사용하여 기능을 구현하고싶은 유혹에 빠질 수 있다. 위의 코드는 합주의 종류를 나타내는 Ensemble과 여러 상수들이 있다. 그리고 연주자의 수를 반환하는 numberOfMusicians라는 메소드가 있는데 이를 ordinal 메소드를 이용하여 구현하였다. 당장은 문제가 없어보이지만 유지보수하기 어려운 코드이다. 상수의 선언 순서를 바꾸는 순간 문제가 발생하고, 똑같이 8명인 연주하는 8중부와 복4중주를 표현할 수도 없다.

 

 


인스턴스 필드 사용

 

public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
    SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8),
    NONET(9), DECTET(10), TRIPLE_QUARTET(12);

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

좋은 유지보수를 위해서는 상수의 위치상 순서와 numberOfMusicians의 결과가 상관이 있어서는 안된다. 따라서 numberOfMusicians를 인스턴스 필드로 만들고 상수를 선언할 때 그 값을 넣어주어야 한다.

 

 

728x90