如何制作枚举isXXX()方法?

yco*_*omp 0 java enums

我将如何插入isRED()isBLACK()枚举这个枚举?我无法弄清楚 - 即使在谷歌搜索一段时间后..我不知道访问什么价值.

enum Suit {
   SPADES,
   HEARTS,
   DIAMONDS,
   CLUBS;
};
Run Code Online (Sandbox Code Playgroud)

这对我来说的主要好处是简化我的通话.. (card.isRED())比短得多(card == EnclosingClass.Suit.HEARTS || card == EnclosingClass.Suit.DIAMONDS);

我的代码中有很多这样的东西

Jon*_*eet 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

我可能不会添加一个isBlack方法,而是依赖于调用者来使用if (!foo.isRed()),但这是一个单独的问题.正如评论中所指出的,如果"红色或黑色"并非严格对立,或者您预计它们将来不会存在对立面,您可能会想要isBlack()- 尽管在这种情况下我至少会返回!isRed()然后更改的实现开始随后出现了需要红色和黑色或两者都没有的套装.

这对我来说是正确的,因为颜色本质上是关于价值的一种状态.虽然你显然可以通过检查已知的红色套装确定它,但我倾向于将场视为表达状态的最自然的方式.它不会增加太多内存:)

三种选择:

1:将逻辑放入方法本身:

enum Suit {
   SPADES,
   HEARTS,
   DIAMONDS,
   CLUBS;

   public boolean isRed() {
     return this == HEARTS || this == DIAMONDS;
   }
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案的缺点是,当你添加一个新值时,它很容易出错 - 编译器不会提示你查看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();
}
Run Code Online (Sandbox Code Playgroud)

3:像2一样,但是给出一个返回一个结果的"默认"实现,并且只在其他结果中覆盖它.

就个人而言,根据第一个解决方案,我会选择这个领域.


And*_*ner 6

对于像这样的小枚举,您可以简单地枚举红色和黑色值:

enum Suit {
   SPADES,
   HEARTS,
   DIAMONDS,
   CLUBS;

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

   boolean isBLACK() {
     return this == SPADES || this == CLUBS;
   }
}
Run Code Online (Sandbox Code Playgroud)