반응형
ITEM 36 "비트 필드 대신 EnumSet 을 사용하라"
예전에는 열거한 값들을 집합으로 사용할 경우, 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴을 주로 사용했었다.
이렇게 만들어진 집합은 비트 필드라고 부르고, 적은 메모리로 다양한 정보를 담을 수 있어 프로그래밍 문제에서 자주 사용하곤 한다.
public class Text {
public static final int STYLE_BOLD = 1 << 0;
public static final int STYLE_ITALIC = 1 << 1;
public static final int STYLE_UNDERLINE = 1 << 2;
public void applyStyles(int styles) { }
}
하지만 이런 기법은 정수 열거 패턴의 단점을 그대로 지니고, 해석하기가 어렵다. 비트 필드 값을 순회하기에도 까다롭고,
최대 몇 비트가 필요할 지 예상해야 한다. 구현 로직을 변경하지 않고서 비트 수를 더 늘릴 수 없기 때문에 적절한 타입을 선정하는 것도 중요하다.
이제는 java.util.EnumSet 클래스를 사용하자. Set 인터페이스를 구현했으며, 타입 안전하고, EnumSet 내부도 비트 벡터로 구현되어 있기 때문에 깔끔하게 코드를 작성할 수 있다. 비트를 직접 다룰 때 생기는 각종 오류들로부터 해방시키고 구현에 구애받지 않고 개발할 수 있어 생산성도 높다.
public class Text {
public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH };
// EnumSet 보다 인터페이스인 Set 을 넘겨 다른 구현체를 넘겼을 때도 처리할 수 있게 하자.
public void applyStyles(Set<Style> styles) {
....
}
}
// 사용부
Text text = new Text();
text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
"열거 타입을 집합형태로 사용할 때는 EnumSet 을 사용하자.
하지만 아직까지도 불변 EnumSet 을 만들 수는 없다.
불변 EnumSet 을 사용하고 싶다면 구글의 구아바 라이브러리를 사용하자"
반응형
'독후감 > Effective JAVA' 카테고리의 다른 글
[Effective JAVA] 38 "확장할 수 있는 열거타입이 필요하면 인터페이스를 사용하라" (2) | 2023.10.17 |
---|---|
[Effective JAVA] 37 "ordinal 인덱싱 대신 EnumMap 을 사용하라" (0) | 2023.08.15 |
[Effective JAVA] 35 "ordinal 메서드 대신 인스턴스 필드를 사용하라" (0) | 2023.05.01 |
[Effective JAVA] 34 "int 상수 대신 열거 타입을 사용하라" (0) | 2023.03.25 |
[Effective JAVA] 33 "타입 안전 이종 컨테이너를 고려하라" (0) | 2022.10.10 |