我正在使用状态机,并且在针对大量可能状态进行测试时,代码变得非常冗长.
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)
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)
除了其他答案:如果该特定状态集在您的应用程序中具有语义上定义的含义(而不是与特定于Enum的特定方法无关),我建议将该测试作为方法包含在同一Enum类中。
enum Mood {
HAPPY, SAD...
public boolean isRatherPositive() {
....
}
}
Run Code Online (Sandbox Code Playgroud)
(或静态方法)要由其他答案建议的任何逻辑来实现(我更喜欢EnumSet,它可以静态或延迟地实例化)。
将方法包含在Enum中有助于避免代码重复,但最重要的是,在将成员添加到Enum或对其进行修改的情况下,可以防止错误。