public class Text {
public static final int STYLE_BOLD = 1 << 0; //1
public static final int STYLE_ITALIC = 1 << 1; //2
public static final int STYLE_UNDERLINE = 1 << 2; //4
public static final int STYLE_STRIKETHROUGH = 1 << 3; //8
public void applyStyles(int styles){ ... }
}
위의 코드는 비트 필드 열거형 상수를 보여줍니다.
장점
- 합집합, 교집합과 같은 집합 연산은 비트 연산을 사용하여 효율적으로 수행할 수 있습니다.
그러나 비트 필드 정수 열거 상수의 단점이 있습니다.
불리
- 비트 필드 값을 그대로 출력할 때 단순한 정수 열거형 상수를 출력할 때보다 해석하기가 훨씬 더 어렵다.
- 비트 필드에 포함된 모든 요소를 반복하는 것도 어렵습니다.
- API를 생성할 때 필요한 비트 수를 미리 예측하고 적절한 유형을 선택해야 합니다.
EnumSet을 사용하자
EnumSet은 Set 인터페이스를 완전히 구현합니다.
유형이 안전하며 다른 Set 구현과 함께 사용할 수 있습니다.
또한 EnumSet의 내부는 비트 벡터로 구현됩니다.
이는 비트 필드에 필적하는 성능을 보여줍니다.
또한 대량 연산을 위한 비트를 효율적으로 처리할 수 있는 산술 연산을 사용하여 구현됩니다.
동시에 비트를 직접 처리할 때 흔히 발생하는 실수로부터 자유로워집니다.
EnumSet이 모든 어려운 작업을 처리하기 때문입니다.
public class Text {
public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }
public void applyStyle(Set<Style> styles) { ... }
}
text.applyStyle(EnumSet.of(Style.BOLD, Style.ITALIC);