effective java——32用EnumSet代替位域

时间:2021-10-10 15:25:20

什么是位域?为什么用到它?
先来看一个例子:

public class Test {
public static final byte STYLE_BOLD = 1<<0; // 1
public static final byte STYLE_ITALIC = 1<<1; // 2
public static final byte STYLE_UNDERLINE = 1<<2; // 4
public static final byte STYLE_STRIKETHROUGH = 1<<3; // 6

//Parameter is bitwise OR of zero or more STYLE_ constants
public void applyStyles(int styles) { ... }
}
1
2
3
4
5
6
7
8
9
这种方法让我们将OR位运算将几个常量合并在一个集合中,称作位域。
text.applyStyles(STYLE_BLOD | STYLE_ITATIC)
这种方式有着int枚举的所有缺点,甚至更多

于是我们需要用EnumSet代替位域。

public class Text{
public enum Style{BOLD,ITALIC,UNDERLINE,STRIKETHROUGH}
public void applyStyles(Set<Style> styles){
//实现方案
}
}
1
2
3
4
5
6
只需要客户端传入EnumSet即可,EnumSet是一个Enum对象的Set。
text.applyStyles(EnumSet.of(Style.BOLD,Style.ITALIC));