Java枚举结合位运算实现多配置

项目中经常会碰到配置参数,根据参数配置不同作出不同的处理,枚举可以对参数的取值进行限制,也能清晰的知道应该传哪些参数,如果参数支持多个枚举值,通常可以采用数组或者可变长度参数,但是这样传参每次都需要进行遍历,然后进行对比来判断究竟传入了那些枚举值,不优雅。

枚举序数

每个枚举类都会有一个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,就表示该枚举值已经被配置。

感谢大家的支持,如有错误请指正,如需转载请标明原文出处!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是对Java位运算枚举法的简要解释: ### 位运算 位运算是对二进制数进行操作的运算符。Java中包含六种位运算符: 1. 与运算(&):将两个二进制数的每一位进行与操作,当且仅当两个数对应的位都为1时,结果的对应位才为1。 2. 或运算(|):将两个二进制数的每一位进行或操作,当两个数对应的位中有至少一个为1时,结果的对应位就为1。 3. 异或运算(^):将两个二进制数的每一位进行异或操作,当且仅当两个数对应的位不相同时,结果的对应位才为1。 4. 取反运算(~):将一个二进制数的每一位取反,即0变为1,1变为0。 5. 左移位运算(<<):将一个二进制数向左移动指定的位数,右侧空位补0。 6. 右移位运算(>>):将一个二进制数向右移动指定的位数,左侧空位补符号位(即如果原二进制数最高位为1,则移动后的空位补1,否则补0)。 位运算Java中的应用场景很多,例如可以使用位运算进行快速的数值计算和状态控制。 ### 枚举枚举法是一种常用的算法思想,其基本思路是枚举所有可能的情况,然后从中找出符合条件的解。在Java中,可以使用枚举类型来实现枚举法。 枚举类型是Java中的一种特殊类型,它允许我们将一组有限的常量放入一个枚举类型中。例如,我们可以定义一个表示星期几的枚举类型: ``` enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } ``` 在枚举类型中,每个常量都是一个枚举类型的实例,我们可以使用枚举类型的实例来代表一个特定的值。例如,我们可以使用Day.MONDAY来表示星期一。 使用枚举类型可以让代码更加清晰和可读,同时也方便进行类型安全的编程。在实现枚举法时,我们通常会将枚举类型作为输入参数,然后枚举其中的所有可能情况,找出符合条件的解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值