Item36 - 비트 필드 대신 EnumSet을 사용하라
2023. 12. 12. 21:40ㆍBook/이펙티브 자바
열거한 값들이 주로 집합으로 사용될 경우, 예전에는 각 상수에 서로 다른 2의 제곱을 할당한 정수 열거 패턴을 사용해왔다.
public static final int STYLE_BOLD = 1; //1
public static final int STYLE_ITALIC = 1 << 1; //2
public static final int UNDERLINE = 1 << 2; //4
public void applyStyles(int styles) {
}
다음과 같은 식으로 비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있었고 이를 비트 필드라 한다.
public static void main(String[] args) {
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
}
=> 3 (1+2)
비트 필드를 사용하면 비트별 연산을 사용해 합집합과 교집합 같은 집합 연산을 효율적으로 수행할 수 있다. 하지만 정수 열거 상수의 단점과 다음과 같은 문제가 더 있다.
1. 해석하기 어렵다
2. 비트 필드에 녹아 있는 원소를 순회하기가 까다롭다.
3. 최대 몇 비트가 필요한지를 API 작성 시 미리 예측하고 적절한 타입을 선택해야 한다.
하지만 더 나은 대안이 있다. EnumSet 클래스를 사용하는 것이다.
public class Text {
public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }
public void applyStyles(Set<Style> styles) {
}
public static void main(String[] args) {
Text text = new Text();
text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
}
}
'Book > 이펙티브 자바' 카테고리의 다른 글
Item39 - 명명 패턴보다 애너테이션을 사용하라 (1) | 2023.12.17 |
---|---|
Item37 - ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2023.12.13 |
Item35 - ordinal 메서드 대신 인스턴스 필드를 사용하라 (0) | 2023.12.11 |
Item34 - int 상수 대신 열거 타입을 사용하라(2) (1) | 2023.12.10 |
Item34 - int 상수 대신 열거 타입을 사용하라(1) (1) | 2023.12.10 |