最简单的方法很可能是有一个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()
- 尽管在这种情况下,我至少会使用开始,然后在后来将其更改为既可以是红色也可以是黑色或既不是红色也不是红色的西装。
这对我来说简直就是对的,因为颜色本质上是一种关于价值的状态。虽然你显然可以通过检查已知的红色西装来确定它,但我倾向于将字段视为表达状态的最自然的方式。它不象它会增加多少内存:)
三种备选方案:
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的枚举的方法(可能的重复http://stackoverflow.com/questions/18883646/java- enum-methods) –