int 상수 대신 열거 타입을 사용하기

정수 열거 패턴(int enum pattern)은 type-safe하지도 않고 표현력도 별로고 궁극적으로 프로그램이 깨지기 쉽다. 문자열 열거 패턴(String enum pattern)은 좋을까? 더 나쁘다. 문자열 상수의 이름 대신 문자열 값을 하드코딩하게 만들기 때문이다.

차라리 열거를 쓰는게 낫다. 열거는 밖에서 접근할 수 있는 생성자를 제공하지 않으니 사실상 final이다. 열거로 만들어진 인스턴스는 딱 하나씩만 존재함이 보장된다. 싱글톤이다. 또한 열거 타입은 각자 네임스페이스가 있어서 열거 원소 간 이름이 겹쳐도 상관 없다. 또한 필드를 선언하고 생성자를 추가하여 열거에 특정 속성들을 매핑할 수도 있다.

public enum Planet {
    MERCURY(1),
    VENUS(2),
    EARTH(3),
    MARS(4),
    JUPITER(5),
    SATURN(6),
    URANUS(7),
    NEPTUNE(8);
    
    private final int order;

    Planet(int order) {
        this.order = order;
    }
}

enum Operator {
    ADD {public double apply(double x, double y) {return x + y;}},
    SUBTRACT {public double apply(double x, double y) {return x - y;}},
    MULTIPLE {public double apply(double x, double y) {return x * y;}},
    DIVIDE {public double apply(double x, double y) {return x / y;}};
    
    public abstract double apply(double x , double y);
}

열거를 언제 사용하면 좋을까? 필요한 원소를 컴파일 타임에 다 알 수 있는 상수 집합이라면 열거가 좋다. 열거로 정의된 상수가 영원히 고정될 필요는 없다.