保持条件逻辑的枚举 - 可能吗?

时间:2015-09-25 18:49:12

标签: java enums conditional-statements predicate

澄清一下,我想要这样的事情:

MESSAGE_1042("messageText", p -> p.contains(MESSAGE_1032), p -> p.isAThing());

以后我可以这样打电话:

for (Message message : Messages) {
    if (message.conditionsMet()) {
        //doTheThing
    }
}

我实际上并不关心我是否可以使用lambdas或Predicates,或者我如何设置条件,或者如何测试它们。我知道我可以用我自己的类来做这个,我只是扩展类并为每个单独的类实现conditionsMet()。

但是,我希望我最终会有很多这样的东西,而且我不希望有一个包含数百个类的包,当我可以让一个包含许多行的Enum时。

有关更多背景信息:这适用于个人项目。我正在研究的一种互动故事,这些消息是用户可以说的。但是,可能有多个条件可能决定他们是否可以选择实际说出消息。

如果我可以将条件存储在包含文本的枚举中,那么这对我来说更方便。当我在其他代码中使用枚举时,我不必担心它的特殊情况。它在允许使用之前就知道它自己的条件,我想问它是否满足这些条件。

有没有合理的方法在枚举中获得这个?或者我将不得不接受很多课程?

2 个答案:

答案 0 :(得分:2)

您可以覆盖单个枚举项中的方法。

enum Message {
   A() {
      @Override
      public boolean conditionsMet() {
          ...
      }
   },
   B() {
      @Override
      public boolean conditionsMet() {
          ...
      }
   },
   ...
   ;
   public abstract boolean conditionsMet();
}

然后给定Message的实例,调用conditionsMet()将从特定实例中获取实现。

只要实例本身提供实现,您就可以将枚举方法标记为抽象。

(谢谢dkatzel。)

答案 1 :(得分:0)

Java区域中的{p> enum特殊类,您不能从外部实现并且不能扩展,但它本质上仍然是一个类。 enum可以有成员和方法,因此您可以将enum本身包含在整个逻辑中。 E.g:

public enum Message {
    MESSAGE1(true), MESSAGE2(false);

    private boolean condition;

    private Message(boolean condition) {
        this.condition = condition;
    }

    public boolean conditionMet() {
        return condition;
    }
}