[Effective Java] 비트(bit) 필드 대신 EnumSet 을 사용하자. |
-
보통 비트 값을 constant 로 사용할 때 아래와 같이 int enum 패턴을 사용하여 각 상수에 2의 n승을 대입한다.
// 비트 필드
public static final int STYLE_BOLD = 1 << 0;
public static final int STYLE_ITALIC = 1 << 1;
...
-
비트 필드를 이용하면 합집합이나 교집합과 같은 집합 연산을 효율적으로 수행할 수 있다.
그러나 비트 필드는 int enum 상수의 모든 단점을 갖는다.
그리고 숫자로 출력될 때 int enum 상수보다 훨씬 더 알아보기 어렵다.
비트 필드로 표현된 모든 요소를 차례대로 반복 처리할 수 있는 방법이 없다.
-
EnumSet 은 하나의 enum 타입에서 추출한 집합 값을 효율적으로 나타낼 수 있다.
내부적으로 각 EnumSet 은 비트 벡터로 표현된다.
만일 enum 타입이 64개 이하 요소라면 ( 대부분 ), 그 EnumSet 전체가 하나의 long 타입으로 표현된다.
따라서 비트 필드의 성능과 견줄만하다.
removeAll 이나 retainAll 처럼 요소를 한꺼번에 처리하는 경우에는 우리가 수동으로 비트 필드를 처리할 때처럼 비트 연산을 사용해서 구현된다.
그러나 우리가 비트 값을 조작할 때의 어려움이나 에러 발생 가능성은 없다.
EnumSet 이 다 대신 해주기 때문이다.
-
EnumSet 은 쉽게 Set 을 생성할 수 있는 풍부한 static 팩토리 메소드들을 제공한다.
예를 들면, EnumSet.of( Style.BOLD, Style.ITALIC );
Summary
EnumSet 은 비트 필드가 갖는 간결함과 성능은 물론, enum 자체의 많은 장점들을 갖는다.
EnumSet 의 유일한 단점은 불변 EnumSet 을 생성할 수 없다는 것.
Collections.unmodifiableSet 메소드를 사용해 EnumSet 을 불변으로 사용할 수 있겠지만, 간결함이나 성능 면에서 에로사항이 생길 수는 있다.
'프로그래밍 놀이터 > 디자인 패턴, 리펙토링' 카테고리의 다른 글
[Effective Java] 인터페이스를 사용해서 확장 가능한 enum 을 만들자. (0) | 2016.12.29 |
---|---|
[Effective Java] ordinal 인덱스 대신 EnumMap 을 사용하자. (0) | 2016.12.27 |
[Effective Java] ordinal 대신 인스턴스 필드를 사용하자. (0) | 2016.12.20 |
[Effective Java] int 상수 대신 enum 을 사용하자. (0) | 2016.12.19 |
[Effective Java] 바운드 와일드 카드를 사용해서 API 의 유연성을 높이자. (0) | 2016.12.05 |
댓글