需要Enum设计指导

时间:2012-12-22 04:16:26

标签: java enums

我非常喜欢在编码时轻松阅读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;
            }
        }
    }

2 个答案:

答案 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方法等)