java enum, 열거형

cornpip·2023년 5월 24일
0

자바

목록 보기
2/19

enum

public class Test {
    enum Direction {
        EAST("East", 10),
        WEST("West", -10),
        SOUTH("South", -20),
        NORTH("North", 20);

        private final String label;
        private final int val;

        Direction(String label, int val) {
            this.label = label;
            this.val = val;
        }

        public String label() {
            return label;
        }

        public int val() {
            return val;
        }

        private static final Map<String, Direction> BY_LABEL =
                Stream.of(values()).collect(Collectors.toMap(Direction::label, Function.identity()));

        private static final Map<Integer, Direction> BY_NUMBER =
                Stream.of(values()).collect(Collectors.toMap(Direction::val, Function.identity()));

        public static Direction valueOfLabel(String label) {
            return BY_LABEL.get(label);
        }

        public static Direction valueOfNumber(int val) {
            return BY_NUMBER.get(val);
        }
    }

    public static void main(String[] args) {
        System.out.println(Direction.valueOfLabel("West").val());
    }
}

enum의 생성자는 private이므로 사용할 수 없고 자동 생성된다.

values()는 컴파일러가 열거형에 자동적으로 추가해주는 메서드 이다.
static E[] values()

열거형 조상인 java.lang.Enum 클래스에 정의된 것 중 ordinal()이 있다.
열거형 상수가 정의된 순서(0부터)를 정수로 반환한다.

ordinal()이 정의된 순서를 반환하지만, 이 값은 내부적인 용도로만 사용되기 위한 것으로 열거형 상수의 값으로 사용하지 않는 것이 좋다고 한다. 그래서 인스턴스 변수와 생성자를 추가하고 get메서드를 만들어 사용한다.

추가

public enum Test {
    USER(Authority.USER),
    ADMIN(Authority.ADMIN);

    private final String authority;

    Test(String authority) {
        this.authority = authority;
    }

    public String getAuthority() {
        return this.authority;
    }

    public static class Authority {
        public static final String USERCODE = "ROLE_12%755642%1021654%8789";
        public static final String ADMIN = "ROLE_ADMIN";
    }
}

위의 코드처럼 static class를 정의해서 상수를 넣을 수 있다. 무슨 이점이 있을까?

만약 User 상수가 User("ROLE_12%755642%1021654%8789") 라면 해당 상수의 의미를 전달하기 어려울 수 있다. 그런 부분에서 Authority.USERCODE라면 해당 상수가 유저 코드를 뜻하는 것을 전달할 수 있다.

profile
https://cornpip.tistory.com 티스토리로 이전했습니다!

0개의 댓글