【问题标题】:How to make an enum isXXX() method?如何制作枚举 isXXX() 方法?
【发布时间】:2023-04-04 17:08:01
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java enums


【解决方案1】:

最简单的方法可能是使用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()),但这是另一回事。如 cmets 所述,如果“红色或黑色”不是严格相反的,或者您预计它们将来不会是相反的,您可能想要isBlack() - 尽管在这种情况下我至少会开始 em> 有一个返回 !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 类似,但给出一个返回一个结果的“默认”实现,并且只在其他结果中覆盖它。

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

【讨论】:

  • 4:定义一个Color 枚举,并传递一个实例而不是布尔参数。该参数的含义可能会更清楚一些,并允许您返回有意义的getColor() 方法。
  • @AndyTurner:是的,这是真的——尽管如果你只想要红/黑,你需要决定你是想让你的Color 枚举只代表这些值,还是执行额外的验证。但是,是的,基本上这是对第一种方法的扩展。
  • 我知道它与布尔方法基本相同,这就是为什么我没有在自己的答案中提供它:)
  • 我会说你应该添加一个 isBlack 方法,而不是让调用者推断东西,因为你的下一个扑克游戏使用 Jokers,而他们没有颜色。 我更喜欢备选方案#1
  • @Andreas:那时我怀疑你已经有一堆代码假设一张卡片是红色或黑色的。点了,但我仍然觉得冗余。
【解决方案2】:

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

enum Suit {
   SPADES,
   HEARTS,
   DIAMONDS,
   CLUBS;

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

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

【讨论】:

  • 啊,这就是我要找的东西 - 我没有意识到你可以测试 这个
  • @ycomp 如果您按照我的建议进行操作,则它不是在静态上下文中。
  • @ycomp:如果您可以在问题中展示一个示例,那么帮助您会更容易......我已经编辑了我的答案,以解释为什么我更喜欢现场方法这个。
  • 是的,我很愚蠢,我在移入枚举的方法中使用了静态修饰符..删除了这些修饰符,它工作正常)
  • @JonSkeet,我的枚举非常简单 - 不需要,但谢谢,它现在可以工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多