2015-10-15 50 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:如果你可以在问题中展示一个例子,它会更容易帮助你...我编辑了我的答案,解释了为什么我更喜欢这个领域的方法。 –