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
라면 해당 상수가 유저 코드를 뜻하는 것을 전달할 수 있다.