最簡單的方法很可能是有一個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) –