이펙티브 자바, 쉽게 정리하기 - item 36. 비트 필드 대신 EnumSet을 사용하라
비트 필드 열거 상수 훑어보기
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 String applyStyles(int styles) {
StringJoiner sj = new StringJoiner(", ");
if((styles & STYLE_BOLD) == 1) {
sj.add("BOLD");
}
if((styles & STYLE_ITALIC) == 2) {
sj.add("ITALIC");
}
if((styles & STYLE_UNDERLINE) == 4) {
sj.add("UNDERLINE");
}
if((styles & STYLE_STRIKETHROUGH) == 8) {
sj.add("STRIKETHROUGH");
}
return sj.toString();
}
@Test
public void bitFieldTest() {
String appliedStyles = applyStyles(STYLE_BOLD | STYLE_STRIKETHROUGH | STYLE_UNDERLINE);
System.out.println("appliedStyles = " + appliedStyles);
}
- 비트 필드 열거 상수 코드의 예이다.
- 여러 상수를 하나의 집합으로 모을 수 있는 장점을 가졌다.
- 이렇게 만들어진 집합을 비트 필드라고 한다.
- 합집합 교집합 등의 연산에 유리하다.
- 정수 열거 상수의 단점을 그대로 가져간다.
- 모든 원소를 순회하기 쉽지 않다.
- 최대 몇비트가 필요한지 API 작성 시 미리 예측하여 적절한 타입을 선택해야 한다.
- 안그러면 나중에 API에서
int
,long
등 타입을 수정해야 하는 일이 벌어진다.
- 안그러면 나중에 API에서
EnumSet
으로 비트 필드 대체해보기
enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }
public void applyStyles(Set<Style> styles) {
StringJoiner sj = new StringJoiner(", ");
for (Style style : styles) {
sj.add(style.name());
}
System.out.println("applied styles = " + sj);
}
@Test
public void enumSetTest() {
applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC, Style.UNDERLINE));
}
- 원소가 총 64개 이하라면
RegularEnumSet
을 사용하여 비트필드만큼의 성능을 내준다.- 그 이상은
JumboEnumSet
을 사용하도록 내부적으로 판단해서, 크기에도 유연하다.
- 그 이상은
- 원소를 순회하기도 쉽다.
핵심 정리
- 열거할 수 있는 타입을 한데 모아 집합 형태로 사용해도,
EnumSet
이 있는 한 비트 필드를 사용할 이유는 없다. - 불변을 원한다면
Collections.unmodifiableSet
으로EnumSet
을 감싸 사용할 수 있다.
반응형
'Java > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바, 쉽게 정리하기 - item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 (0) | 2022.02.24 |
---|---|
이펙티브 자바, 쉽게 정리하기 - item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2022.02.24 |
이펙티브 자바, 쉽게 정리하기 - item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라 (0) | 2022.02.24 |
이펙티브 자바, 쉽게 정리하기 - item 34. int 상수 대신 열거 타입을 사용하라 (0) | 2022.02.24 |
이펙티브 자바, 쉽게 정리하기 - item 33. 타입 안전 이종 컨테이너를 고려하라 (0) | 2022.01.24 |