如何匹配枚举对象及其关联的常量值?

时间:2014-06-10 10:39:25

标签: java enums

我创建了这个枚举:

public enum CoffeeSorts {
    Coffee("Kaffee"), Espresso("Espresso"), Mocca("Mocca"), Cappuccino(
            "Cappuccino"), LatteMacchiato("Latte Macchiato"), DoubleEspresso(
            "doppelter Espresso");

    private final String stringValue;

    private CoffeeSorts(final String s) {
        stringValue = s;
    }

    public String toString() {
        return stringValue;
    }
}

我尝试了以下方式来使用它

public ACoffee createCoffee(String type) {

        switch (type) {
        case CoffeeSorts.Cappuccino :
            try {
                return new ChocolateSprincles(new Cream(new Coffee()));
            } catch (Exception e) {}
            return null;
            break;
        case CoffeeSorts.LatteMacchiato :
            try {
                return new ...
            }
        .
        .
        .
    }

它只给我一个错误,说“无法从CoffeeSorts转换为String”。 你能告诉我我做错了吗?

3 个答案:

答案 0 :(得分:5)

您的type变量是String,但您正在尝试指定{em>值,这些值是CoffeeSort。您需要先将String转换为CoffeeSort,或更改签名。

例如:

public ACoffee createCoffee(CoffeeSort type) {
    ...
}

public ACoffee createCoffee(String typeName) {
    CoffeeSort type = CoffeeSort.valueOf(typeName);
    ...
}

另请注意,在break;声明之后,您无法return,因为它无法访问代码。 (我希望你的异常处理不是那样的,或者......)

最后,请考虑完全更改代码,将createCoffee方法放在枚举本身中。然后你根本不需要一个switch语句。您可以将其设置为在每个枚举值中重写的抽象方法。

public enum CoffeeSort {
    Coffee("Kaffee") {
        @Override public ACoffee createCoffee() {
           ...
        }
    },
    Espresso("Espresso") { ... },
    Mocca("Mocca") { ... },
    Cappuccino("Cappuccino") { ... },
    LatteMacchiato("Latte Macchiato") { ... },
    DoubleEspresso("doppelter Espresso") { ... };

    private final String stringValue;

    private CoffeeSorts(final String s) {
        stringValue = s;
    }

    @Override
    public String toString() {
        return stringValue;
    }

    public abstract ACoffee createCoffee();
}

答案 1 :(得分:4)

type中的switch(type)应该是CoffeeSorts类型的对象。你传了一个字符串。

答案 2 :(得分:2)

您的方法签名应为:

public ACoffee createCoffee(CoffeeSorts type)

您的switch语句适用于type,只有当type属于CoffeeSorts类型时,您放在那里的案例陈述才有意义。

旁注:枚举通常用Java大写(参见Coding Conventions - Naming Enums)。