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

时间:2015-10-15 21:19:29

标签: java enums

如何在此枚举中插入isRED()isBLACK()方法?我无法弄清楚 - 即使在谷歌上搜索了一段时间后......我也不知道要访问什么价值。

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

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

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

2 个答案:

答案 0 :(得分: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() - 尽管在这种情况下我至少开始一个返回!isRed()的实现,然后随着时间的推移更改为红色和黑色或两者都没有,因为需要出现。

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

三种选择:

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类似,但是给出一个“默认”实现返回一个结果,并且仅在其他结果中覆盖它。

就个人而言,按照第一个解决方案,我会选择这个领域。

答案 1 :(得分:6)

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

enum Suit {
   SPADES,
   HEARTS,
   DIAMONDS,
   CLUBS;

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

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