最简单的方法可能是使用boolean 字段来指示该套装是否为红色。例如:
enum Suit {
SPADES(false),
HEARTS(true),
DIAMONDS(true),
CLUBS(false);
private final boolean red;
private Suit(boolean red) {
this.red = red;
}
public boolean isRed() {
return red;
}
}
我可能不会添加isBlack 方法,而是依赖调用者使用if (!foo.isRed()),但这是另一回事。如 cmets 所述,如果“红色或黑色”不是严格相反的,或者您预计它们将来不会是相反的,您可能想要isBlack() - 尽管在这种情况下我至少会开始 em> 有一个返回 !isRed() 的实现,然后根据需要将其更改为红色和黑色或两者都不是的西装。
这对我来说是正确的,因为颜色本质上是关于价值的一种状态。虽然您显然可以通过检查已知的红色套装来确定它,但我倾向于将字段视为表达状态的最自然方式。它不会增加太多内存:)
三种选择:
1:将逻辑放入方法本身:
enum Suit {
SPADES,
HEARTS,
DIAMONDS,
CLUBS;
public boolean isRed() {
return this == HEARTS || this == DIAMONDS;
}
}
此解决方案的缺点是当您添加新值时容易出错 - 编译器不会提示您查看 isRed 方法并考虑是否要在此处添加另一个案例。
2:(丑)把它变成一个抽象方法,每个花色都覆盖。
enum Suit {
SPADES {
@Override public boolean isRed() { return false; }
},
HEARTS,
@Override public boolean isRed() { return true; }
},
DIAMONDS,
@Override public boolean isRed() { return true; }
},
CLUBS {
@Override public boolean isRed() { return false; }
};
public abstract boolean isRed();
}
3:与 2 类似,但给出一个返回一个结果的“默认”实现,并且只在其他结果中覆盖它。
根据第一个解决方案,我个人会选择现场。