[이펙티브 자바] 아이템 36 :

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
        
        public void applyStyles(int styles){ ... }
}

위의 코드는 비트 필드 열거형 상수를 보여줍니다.

장점

  • 합집합, 교집합과 같은 집합 연산은 비트 연산을 사용하여 효율적으로 수행할 수 있습니다.

그러나 비트 필드 정수 열거 상수의 단점이 있습니다.

불리

  • 비트 필드 값을 그대로 출력할 때 단순한 정수 열거형 상수를 출력할 때보다 해석하기가 훨씬 더 어렵다.
  • 비트 필드에 포함된 모든 요소를 ​​반복하는 것도 어렵습니다.
  • API를 생성할 때 필요한 비트 수를 미리 예측하고 적절한 유형을 선택해야 합니다.

EnumSet을 사용하자

EnumSet은 Set 인터페이스를 완전히 구현합니다.

유형이 안전하며 다른 Set 구현과 함께 사용할 수 있습니다.

또한 EnumSet의 내부는 비트 벡터로 구현됩니다.

이는 비트 필드에 필적하는 성능을 보여줍니다.

또한 대량 연산을 위한 비트를 효율적으로 처리할 수 있는 산술 연산을 사용하여 구현됩니다.

동시에 비트를 직접 처리할 때 흔히 발생하는 실수로부터 자유로워집니다.

EnumSet이 모든 어려운 작업을 처리하기 때문입니다.

public class Text {

	public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }
    
    public void applyStyle(Set<Style> styles) { ... }
}

text.applyStyle(EnumSet.of(Style.BOLD, Style.ITALIC);