해결 방안은 정적 초기화 블록(static initializer)에서 초기화하는 것이다.
public enum Modifier {
PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, ABSTRACT;
private int mask;
static {
int maskBit = 1;
for (Modifier m : Modifier.values()) {
m.mask = maskBit;
maskBit *= 2;
}
}
...
}
열거 상수가 생성되고 나면 정적 변수 초기화와 정적 초기화 블록이 평소처럼 위쪽부터 차례로 실행된다.
Note ≣
클래스 내부에 열거 타입을 중첩할 수도 있다. 이렇게 중첩된 열거는 암시적으로 정적 중첩 클래스가 된다. 따라서 해당 열거 타입의 메서드에서 감싸는 클래스의 인스턴스 변수를 참조할 수 없다.