본문 바로가기

STUDY/이펙티브자바

6-3) 비트 필드 대신 EnumSet을 사용하라

비트 필드 열거 상수

 

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 static final int STYLE_STRIKETHROUGH			= 1 << 3;
	
    public void applyStyles(int styles) {
        ...	
    }
    ...
}

열거한 값들이 집합으로 사용되고 메모리 사용이 제한되어 있을 경우, 각 값을 한 비트씩 할당하여 비트연산하는 방식을 사용했었다. 하지만 이 방식은 파라미터로 전달되는 타입을 확실히 제한할 수 없다. 그리고 비트연산된 값을 보고 개발자가 그 의미를 해석하기도 쉽지 않다.

 

 


EnumSet

 

public class Text {
    public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}

    public void applyStyles(Set<Style> styles) {
        ...
    }
    ...
}

EnumSet은 enum 상수의 집합을 효과적으로 표현해준다. EnumSet의 내부는 비트 벡터로 구현되어 있어서 원소가 64개 이하라면 long 변수 하나로 전체를 표현한다. 개발자가 그 의미를 해석하기도 더 쉬워졌고, 파라미터의 타입을 필요한 enum 타입으로 제한한다는 점에서 더 좋은 코드라고 할 수 있다.

728x90