관례적으로 비트값일 경우 int enum패턴을 사용한다

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
	
  //  매개 변수는 하나 이상의 STYLE_상수를 비트 OR 한다.
	public void applyStyles(int style) { 
		if (style & STYLE_BOLD) {
			// bold
		}	
		if (style & STYLE_ITALIC) {
			// itallic
		}
  }
}

이렇게 하면 여러개의 값을 OR 연산자로 전달할 수 있다. (이것을 비트 필드라 한다.)

text.applyStlyes(STYLE_BOLD | STYLE_ITALIC);

비트 필드를 이용하면 합집합, 교집합같은 집합 연산을 효율적으로 수행가능.

그러나 비트 필드는 int enum의 모든 단점을 갖는다.

이럴땐, EnumSet을 사용하자.

enumSet은 비트 백터(bit vector)로 표현된다.

[x(w-1), x(w), ..., x(1), x(0)], w = 64

enum 타입이 64개 이하일 경우 long으로 표현가능하다. 따라서 비트 필드의 성능과 견줄만하다.

removeAll, retainAll처럼 요소를 한번에 처리할때도 수동으로 비트 처리할때처럼 동작한다.

그리고, 에러 발생 가능성은 없다.

public class Text {
	public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }
	// 어떤 set도 전달 가능, EnumSet이 가장 좋다.
	public void applyStyles(Set<Style> styles) { ... }
}
text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC);

enum 타입이 단지 비트 집합에 사용된다는 것 때문에 그것을 비트 필드로 나타내야 할 이유는 없다.

EnumSet의 유일한 단점은, 불변 EnumSet 을 생성할 수 없다는것. (1.6기준)

Collections.unmodifiableSet을 사용하면 EnumSet을 불변으로 사용가능하나, 간결함, 성능이 떨어짐.