包含条件逻辑的枚举 - 可能吗?

Enums that hold Conditional Logic - Possible?

澄清一下,我想要这样的东西:

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

之后,我可以这样调用:

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

我实际上不在乎我是否可以使用 lambda 或谓词,或者我如何设置条件,或者如何测试它们。我知道我可以用我自己的 classes 来做到这一点,我只是扩展 class 并为每个人实现 conditionsMet() class.

但是,我希望我最终会有很多这样的东西,我不想有一个包含数百个 classes 的包,因为我可以有一个包含很多行的枚举.

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

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

那么有什么合理的方法可以在枚举中获得它吗?还是我将不得不接受有很多 classes?

enums in Java area special kind of class that you can't instansiate from outside and can't extend, but it is still essentially a class. enums 可以有成员和方法,因此您可以将整个逻辑包含在 enum 本身中。例如:

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

    private boolean condition;

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

    public boolean conditionMet() {
        return condition;
    }
}

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

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

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

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

(感谢 dkatzel。)