有没有办法在Java中按位OR枚举?

时间:2011-06-08 17:15:07

标签: java enums

我正在使用状态机,并且在针对大量可能状态进行测试时,代码变得非常冗长。

enum Mood {
    HAPPY, SAD, CALM, SLEEPY, OPTIMISTIC, PENSIVE, ENERGETIC;
}

有没有办法做到这一点:

if (currentMood == (HAPPY | OPTIMISTIC | ENERGETIC) {}

而不是:

if (currentMood == HAPPY || currentMood == OPTIMISTIC || currentMood == ENERGETIC) {}

或者在这种情况下坚持使用整数和标志会更好吗?

9 个答案:

答案 0 :(得分:34)

也许使用类似EnumSet的内容?

if (EnumSet<Mood>.of(HAPPY, OPTIMISTIC, ENERGETIC).contains(currentMood))
{ 
 //Do stuff...
}

答案 1 :(得分:14)

为您的枚举提供一个int属性。

enum Mood {
    private int id;

    HAPPY(1), SAD(2), CALM(4), SLEEPY(8), OPTIMISTIC(16), PENSIVE(32), ENERGETIC(64);

    Mood( int id ) {
        this.id = id;
    }
}

关于if,测试这个atrribute。

if ( currentMood & ( HAPPY.id | OPTIMISTIC.id | ENERGETIC.id ) != 0 ) { ... }

答案 2 :(得分:4)

除了其他答案之外:如果特定的一组状态在您的应用程序中具有语义定义的含义(而非独立于您的特定方法,特定于Enum),我建议将该测试作为一种方法包含在其中恩类。

enum Mood {
     HAPPY, SAD...

     public boolean isRatherPositive() {
       ....
     }

}

(或静态方法)由其他答案建议的任何逻辑实现(我赞成EnumSet,可以静态地实例化)。

让Enum中的方法对避免代码重复很有用,但最重要的是,为了防止在向Enum添加成员或修改成员的情况下出现错误。

答案 3 :(得分:3)

switch(currentmood){
    case HAPPY:
    case OPTIMISTIC:...
        Then do this
        break;
    default://else
}

答案 4 :(得分:1)

你可以给你的枚举一个布尔标志并测试它。

enum Mood {
    HAPPY(true), SAD, CALM, SLEEPY, OPTIMISTIC(true), PENSIVE, ENERGETIC(true);
    final boolean good;

    Mood(){this(false);}

    Mood(boolean isgood){this.good = isgood;}

    public isGood(){return good;}
}

这样检查很短

if (currentMood.isGood()) {}

答案 5 :(得分:1)

一种方法是使用EnumSet / switch / if等。如果您以某种方式对枚举进行分类,而这种枚举本身并不是枚举本身的一部分,那么这是有意义的。例如,颜色是否是国旗颜色的一部分。 “依赖模型”是国旗依赖于颜色,但颜色并不关心国旗的存在。

另一方面,如果您正在尝试确定颜色是否为原色(人类颜色模型的固有颜色),则它属于枚举类本身。所以,

enum Color {
  private final boolean _crtPrimary;

  Red(true), Green(true), Blue(true), Black(false)

  Color(boolean crtPrimary) {
    _crtPrimary = crtPrimary;
  }

  public boolean isCRTPrimary() {
    return _crtPrimary;
  }
}

答案 6 :(得分:1)

您可以使用YourEnum。 values()

例如,我有一个名为 Enumerations 的类。 在其中,我有多个枚举类。

例如:

public class Enumerations {

public enum smtg
{
    Fast(1),
    Slow(2);

    private int number;
    private smtg(final int num) { number = num; }
    public int getsmtg()
    {
        return number;
    }
}
......

}

当我想按位使用时,我就这样使用它:

Enumerations.smtg.values()[Enumerations.smtg.Slow.ordinal() | Enumerations.smtg.Fast.ordinal()]

答案 7 :(得分:0)

当你使用||时你必须指定每次比较的两个值。你可以轻松地编写一个小方法来做到这一点。

if (currentMood.hasMood(HAPPY, OPTIMISTIC, ENERGETIC)) {}

public boolean hasMood(Mood ....)

答案 8 :(得分:0)

另一种选择:

public enum PaymentResponse {
    PP_SUCCESS, PP_FAILURE, CC_SUCCESS, CC_FAILURE;

    public boolean isSuccessful() {
            return ordinal() == CC_SUCCESS.ordinal()  ||  
                   ordinal() == PP_SUCCESS.ordinal() ;
    }
}