java - 如何创建枚举 isXXX() 方法?

标签 java enums

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

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

这对我来说的主要好处是简化我的调用。 (card.isRED())(card == EnendingClass.Suit.HEARTS || card == EnclosureClass.Suit.DIAMONDS);

我的代码中有很多这样的

最佳答案

最简单的方法可能是使用一个 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 类似,但给出一个返回一个结果的“默认”实现,并且仅在其他结果中覆盖它。

就我个人而言,我会根据第一个解决方案选择现场。

关于java - 如何创建枚举 isXXX() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33158716/

相关文章:

c# - 无法更新 TinyMCE 中的文本框

java - 在 Selenium Webdriver 中,哪个在性能方面更好 Linktext 或 css?

java - 枚举实现接口(interface)被 validator 拒绝 (java.lang.VerifyError)

python - 如何在 Python 3 枚举类中定义不是枚举值的属性?

java - 如何为 JavaFX WebView URL 设置代理?

java - 将tsv导入到hbase中时出错

c# - 当顺序不同时,将枚举转换为枚举不起作用

java - 如何通过Spring注入(inject)扩展枚举?

具有实现接口(interface)的多个枚举的 Java 泛型

java - 将 CIDR 地址转换为子网掩码和网络地址