如何将 isRED()
和 isBLACK()
方法插入到此枚举中?我无法弄清楚 - 即使在谷歌搜索一段时间后..我不知道要访问什么值。
enum Suit {
SPADES,
HEARTS,
DIAMONDS,
CLUBS;
};
这对我来说的主要好处是简化我的调用。 (card.isRED())
比 (card == EnendingClass.Suit.HEARTS || card == EnclosureClass.Suit.DIAMONDS);
我的代码中有很多这样的
最佳答案
最简单的方法可能是使用一个 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 类似,但给出一个返回一个结果的“默认”实现,并且仅在其他结果中覆盖它。
就我个人而言,我会根据第一个解决方案选择现场。
关于java - 如何创建枚举 isXXX() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33158716/