项目中经常会碰到配置参数,根据参数配置不同作出不同的处理,枚举可以对参数的取值进行限制,也能清晰的知道应该传哪些参数,如果参数支持多个枚举值,通常可以采用数组或者可变长度参数,但是这样传参每次都需要进行遍历,然后进行对比来判断究竟传入了那些枚举值,不优雅。
枚举序数
每个枚举类都会有一个ordinal属性,这个属性代表着当前枚举值在枚举类中的序号。
public enum Gravity {
LEFT, //ordinal=0
TOP, //ordinal=1
RIGHT, //ordinal=2
BOTTOM, //ordinal=3
CENTER_HORIZONTAL, //ordinal=4
CENTER_VERTICAL, //ordinal=5
CENTER; //ordinal=6
private final int mask;
Gravity() {
this.mask = (1 << ordinal());
}
public final int getMask() {
return this.mask;
}
}
通过调用枚举对象的**ordinal()**方法可以获取枚举值对应的序数。
位掩码
public enum Gravity {
LEFT,
TOP,
RIGHT,
BOTTOM,
CENTER_HORIZONTAL,
CENTER_VERTICAL,
CENTER;
private final int mask;
Gravity() {
this.mask = (1 << ordinal());
}
public final int getMask() {
return this.mask;
}
}
通过将1左移序数位以后,对应的序数位就为1,这样每个枚举值对应1的位置都不同。得到的掩码值如下:
0000001 LEFT
0000010 TOP
0000100 RIGHT
0001000 BOTTOM
0010000 CENTER_HORIZONTAL
0100000 CENTER_VERTICAL
1000000 CENTER
按位或处理多个配置
假如现在有个参数的为gravity,利用按位或(OR)对gravity和mask进行运算:
int gravity = Gravity.LEFT.getMask() | Gravity.TOP.getMask();
这样得到的gravity的值就是0000011,这样第一位和第二位都是1,表示LEFT和TOP都有。
按位与判断是否配置
有了gravity的值,接下来就是判断枚举值是否配置。
public static boolean isEnable(int gravity, Gravity e) {
return (gravity & e.getMask()) != 0;
}
用gravity和某个Gravity枚举值的掩码进行按位与以后,只要结果不为0,就表示该枚举值已经被配置。
感谢大家的支持,如有错误请指正,如需转载请标明原文出处!