澄清一下,我想要这样的事情:
MESSAGE_1042("messageText", p -> p.contains(MESSAGE_1032), p -> p.isAThing());
以后我可以这样打电话:
for (Message message : Messages) {
if (message.conditionsMet()) {
//doTheThing
}
}
我实际上并不关心我是否可以使用lambdas或Predicates,或者我如何设置条件,或者如何测试它们。我知道我可以用我自己的类来做这个,我只是扩展类并为每个单独的类实现conditionsMet()。
但是,我希望我最终会有很多这样的东西,而且我不希望有一个包含数百个类的包,当我可以让一个包含许多行的Enum时。
有关更多背景信息:这适用于个人项目。我正在研究的一种互动故事,这些消息是用户可以说的。但是,可能有多个条件可能决定他们是否可以选择实际说出消息。
如果我可以将条件存储在包含文本的枚举中,那么这对我来说更方便。当我在其他代码中使用枚举时,我不必担心它的特殊情况。它在允许使用之前就知道它自己的条件,我想问它是否满足这些条件。
有没有合理的方法在枚举中获得这个?或者我将不得不接受很多课程?
答案 0 :(得分:2)
您可以覆盖单个枚举项中的方法。
enum Message {
A() {
@Override
public boolean conditionsMet() {
...
}
},
B() {
@Override
public boolean conditionsMet() {
...
}
},
...
;
public abstract boolean conditionsMet();
}
然后给定Message
的实例,调用conditionsMet()
将从特定实例中获取实现。
只要实例本身提供实现,您就可以将枚举方法标记为抽象。
(谢谢dkatzel。)
答案 1 :(得分:0)
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;
}
}