2015-10-15 49 views
0

如何將isRED()isBLACK()方法插入此枚舉中?我無法弄清楚 - 甚至在google搜索了一段時間之後..我不知道訪問什麼值。如何使枚舉isXXX()方法?

enum Suit { 
    SPADES, 
    HEARTS, 
    DIAMONDS, 
    CLUBS; 
}; 

的這對我來說最大的好處就是簡化我的電話.. (card.isRED())(card == EnclosingClass.Suit.HEARTS || card == EnclosingClass.Suit.DIAMONDS);

短得多,我有很多這樣的在我的代碼

+0

[Java的枚舉的方法(可能的重複http://stackoverflow.com/questions/18883646/java- enum-methods) –

回答

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() - 儘管在這種情況下,我至少會使用開始,然後在後來將其更改爲既可以是紅色也可以是黑色或既不是紅色也不是紅色的西裝。

這對我來說簡直就是對的,因爲顏色本質上是一種關於價值的狀態。雖然你顯然可以通過檢查已知的紅色西裝來確定它,但我傾向於將字段視爲表達狀態的最自然的方式。它不象它會增加多少內存:)

三種備選方案:

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一樣,但給出了一個返回一個結果的「默認」實現,並且只在其他結果中覆蓋它。

就我個人而言,我會按照第一個解決方案與現場一起走。

+0

4:定義一個'Color'枚舉,並且傳遞一個實例來代替布爾參數。這個參數的含義可能會更清楚一些,並允許您返回一個有意義的'getColor()'方法。 –

+0

@AndyTurner:是的,這是真的 - 雖然如果你只想要紅/黑,你需要決定你是否希望你的'Color'枚舉只代表那些值,或者執行額外的驗證。但是,基本上這是對第一種方法的擴展。 –

+0

我知道它與布爾方法基本相同,這就是爲什麼我不提供它在我自己的答案:) –

6

對於這樣的小枚舉,你可以簡單地列舉了紅色和黑色的值:

enum Suit { 
    SPADES, 
    HEARTS, 
    DIAMONDS, 
    CLUBS; 

    boolean isRED() { 
    return this == HEARTS || this == DIAMONDS; 
    } 

    boolean isBLACK() { 
    return this == SPADES || this == CLUBS; 
    } 
} 
+0

啊,這就是我正在尋找的 - 我沒有意識到你可以測試**這個** – ycomp

+1

@ycomp如果你這樣做,就像我建議的那樣,它不是靜態的。 –

+0

@ycomp:如果你可以在問題中展示一個例子,它會更容易幫助你...我編輯了我的答案,解釋了爲什麼我更喜歡這個領域的方法。 –