我非常喜欢在编码时轻松阅读Enums。 最近我遇到了一个任务,我需要接受一个关键字列表,每个都会执行一个动作。
关键字示例:BREAKFAST,午餐,晚餐
所以我希望能够写出这样的东西:
String whatImGoingToMake = Keywords.BREAKFAST("banana").getPopularRecipe();
这里的想法是获得香蕉作为配料的流行早餐食谱。
我想到了这一点,因为我认为使用反射它应该能够工作。
问题是我无法调用getPopularRecipe(),因为它不是静态的,不允许内部类。
我是否正确,强制枚举执行此类操作并使用类代码并不常见?下一个编码器出现的最简单的实现是什么?选择这个来理解?
也许因为它已经很晚了,但我现在正在努力。
如果可能的话,我试图远离一长串IF语句或switch语句。我只是不喜欢看到它们而且不惜一切代价避免它们。所以我不想写像:
if (param.equals("BREAKFAST") {
//lookup in breakfast db
} else if (param.equals("LUNCH") {
//you get the idea - I dont like this since it can go on forever if we start adding BRUNCH, SUPPER, SNACK
}
以下是我对上班感兴趣的词汇:
public enum MyUtil {
BREAKFAST {
public String getPopularRecipe(String ingredient) {
//do something with ingredient
return recipe;
}
},
LUNCH {
public String getPopularRecipe(String ingredient) {
//do something with ingredient
return recipe;
}
}
}
答案 0 :(得分:3)
如果我正确理解您的问题,您需要在枚举中使用abstract
方法getPopularRecipe()
,并且所有枚举实例都应该覆盖。
示例:
public enum MyUtil {
BREAKFAST {
@Override
public String getPopularRecipe(String ingredient) {
//do something with ingredient
return recipe;
}
},
LUNCH {
@Override
public String getPopularRecipe(String ingredient) {
//do something with ingredient
return recipe;
}
}
public abstract String getPopularRecipe(String ingredient);
}
有关详细信息,请参阅此tutorial(阅读结束)。
答案 1 :(得分:0)
你的事情过于复杂:
public enum Meal {
BREAKFAST("Bacon and eggs"),
LUNCH("Salad"),
DINNER("Steak and veg");
private final String ingredient;
Meal(String ingredient) {
// do whatever you like here
this.ingredient = ingredient;
}
public String getPopularRecipe() {
return ingredient;
}
}
构造函数,字段和方法可以像普通类一样复杂。与许多人意识到的相比,枚举与普通类更相似。它们甚至都不可变(小学生注意:虽然引用是最终的,但实例与任何类一样可变 - 例如枚举可能有setter方法等)