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

27 java enums

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

enum Mood {
    HAPPY, SAD, CALM, SLEEPY, OPTIMISTIC, PENSIVE, ENERGETIC;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点:

if (currentMood == (HAPPY | OPTIMISTIC | ENERGETIC) {}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

if (currentMood == HAPPY || currentMood == OPTIMISTIC || currentMood == ENERGETIC) {}
Run Code Online (Sandbox Code Playgroud)

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

Yet*_*eek 37

也许使用像EnumSet这样的东西?

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

  • 我想在这种情况下你甚至可以放弃<Mood> (4认同)

Mar*_*ato 17

给你的枚举一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

关于if,测试反对这个atrribute.

if ( currentMood & ( HAPPY.id | OPTIMISTIC.id | ENERGETIC.id ) != 0 ) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 你不能使用`ordinal()`因为那会给你'0`,`1`,`2`,`3`等等,它们不能用于按位"OR". (3认同)
  • 有点迟到的反应,但你可能会做`1 << ordinal()` (3认同)

leo*_*loy 5

除了其他答案:如果该特定状态集在您的应用程序中具有语义上定义的含义(而不是与特定于Enum的特定方法无关),我建议将该测试作为方法包含在同一Enum类中。

enum Mood {
     HAPPY, SAD...

     public boolean isRatherPositive() {
       ....
     }

}
Run Code Online (Sandbox Code Playgroud)

(或静态方法)要由其他答案建议的任何逻辑来实现(我更喜欢EnumSet,它可以静态或延迟地实例化)。

将方法包含在Enum中有助于避免代码重复,但最重要的是,在将成员添加到Enum或对其进行修改的情况下,可以防止错误。