0

我真的很喜欢在编码时轻松阅读枚举。最近我遇到了一个任务,我需要接受一个关键字列表,每个关键字都会执行一个操作。

关键字示例:早餐、午餐、晚餐

所以我希望能够写出这样的东西: 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;
            }
        }
    }

4

2 回答 2

3

如果我正确理解您的问题,您需要在 Enum 中有一个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);
    }

有关更多信息,请参阅本教程(阅读至最后)。

于 2012-12-22T04:20:30.837 回答
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 方法等)

于 2012-12-22T05:28:23.313 回答