包含条件逻辑的枚举 - 可能吗?
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?
enum
s 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. enum
s 可以有成员和方法,因此您可以将整个逻辑包含在 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。)
澄清一下,我想要这样的东西:
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?
enum
s 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. enum
s 可以有成员和方法,因此您可以将整个逻辑包含在 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。)