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
// 매개변수 styles는 0개 이상의 STYLE_ 상수를 비트별 OR 한 값
public void applyStyles(int styles){...}
}
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
- API를 수정하기 않고는 비트 수를 더 늘릴 수 없기 때문이다.(int: 32비트, long: 64비트)
- Set 인터페이스를 완벽히 구현한다.
- 타입 안전하고, 다른 어떤 Set 구현체와도 함께 사용할 수 있다.
- 원소가 64개 이하라면 즉 EnumSet 전체를 long 변수 하나로 표현할 수 있다.
public class Text {
public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}
// 어떤 Set을 넘겨도 되나, EnumSet이 가장 좋다.
public void applyStyles(Set<Style> styles) {
System.out.printf("Applying styles %s to text%n",
Objects.requireNonNull(styles));
}
// 사용 예
public static void main(String[] args) {
Text text = new Text();
text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
}
}
- 자바 9까지는 그렇다.
- Collections.unmodifiableSet으로 Enum을 감싸 사용할 수 있다.
Reference: