我使用的是状态机,在针对大量可能的状态进行测试时,代码变得非常冗长。
enum Mood {
HAPPY, SAD, CALM, SLEEPY, OPTIMISTIC, PENSIVE, ENERGETIC;
}有没有办法做到这一点:
if (currentMood == (HAPPY | OPTIMISTIC | ENERGETIC) {}而不是这样:
if (currentMood == HAPPY || currentMood == OPTIMISTIC || currentMood == ENERGETIC) {}或者在这种情况下使用整数和标志会更好?
发布于 2011-06-09 01:19:49
也许使用像EnumSet这样的东西
if (EnumSet<Mood>.of(HAPPY, OPTIMISTIC, ENERGETIC).contains(currentMood))
{
//Do stuff...
}发布于 2011-06-09 01:28:24
给你的枚举一个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上,针对此属性进行测试。
if ( currentMood & ( HAPPY.id | OPTIMISTIC.id | ENERGETIC.id ) != 0 ) { ... }发布于 2011-06-09 01:35:07
除了其他答案:如果特定的状态集在您的应用程序中具有语义定义的含义(相当独立于您的特定方法,特定于Enum),我建议将该测试作为一个方法包含在同一个Enum类中。
enum Mood {
HAPPY, SAD...
public boolean isRatherPositive() {
....
}
}(或静态方法)由其他答案建议的任何逻辑实现(我更喜欢EnumSet,它可以静态地或惰性地实例化)。
将方法放在Enum中对于避免代码重复很有用,但最重要的是,在向Enum添加成员或修改它的情况下防止but。
https://stackoverflow.com/questions/6282619
复制相似问题