如何在此枚举中插入isRED()
和isBLACK()
方法?我无法弄清楚 - 即使在谷歌上搜索了一段时间后......我也不知道要访问什么价值。
enum Suit {
SPADES,
HEARTS,
DIAMONDS,
CLUBS;
};
这对我来说主要的好处是简化了我的通话。(card.isRED())
比(card == EnclosingClass.Suit.HEARTS || card == EnclosingClass.Suit.DIAMONDS);
短得多
我的代码中有很多这样的代码
答案 0 :(得分:7)
最简单的方法可能是有一个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())
,但这是另一回事。如评论中所述,如果“红色或黑色”并非严格对立,或者您预计它们将来不会存在对立面,您可能需要isBlack()
- 尽管在这种情况下我至少开始一个返回!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类似,但是给出一个“默认”实现返回一个结果,并且仅在其他结果中覆盖它。
就个人而言,按照第一个解决方案,我会选择这个领域。
答案 1 :(得分:6)
对于这样的小枚举,您可以简单地枚举红色和黑色值:
enum Suit {
SPADES,
HEARTS,
DIAMONDS,
CLUBS;
boolean isRED() {
return this == HEARTS || this == DIAMONDS;
}
boolean isBLACK() {
return this == SPADES || this == CLUBS;
}
}