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

2022-09-01 06:37:08

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

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

有没有办法做到这一点:

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

取而代之的是:

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

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


答案 1

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

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

答案 2

为枚举指定一个 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;
    }
}

在如果上,针对这种atrribute进行测试。

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