我正在使用状态机,并且在针对大量可能状态进行测试时,代码变得非常冗长。
enum Mood {
HAPPY, SAD, CALM, SLEEPY, OPTIMISTIC, PENSIVE, ENERGETIC;
}
有没有办法做到这一点:
if (currentMood == (HAPPY | OPTIMISTIC | ENERGETIC) {}
而不是:
if (currentMood == HAPPY || currentMood == OPTIMISTIC || currentMood == ENERGETIC) {}
或者在这种情况下坚持使用整数和标志会更好吗?
答案 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() ;
}
}