切换枚举值:case表达式必须是常量表达式

时间:2014-08-07 13:24:00

标签: java enums switch-statement

我有一个具有以下结构的枚举:

public enum Friends {
    Peter("Peter von Reus", "Engineer"),
    Ian("Ian de Villiers", "Developer"),
    Sarah("Sarah Roos", "Sandwich-maker");

    private String fullName;
    private String occupation;

    private Person(String fullName, String occupation) {
        this.fullName = fullName;
        this.occupation = occupation;
    }

    public String getFullName() {
        return this.fullName;
    }

    public String getOccupation() {
        return this.occupation;
    }
}

我现在想要使用switch确定变量name是否与某个enum相关联:

//Get a value from some magical input
String name = ...

switch (name) {
    case Friends.Peter.getFullName():
        //Do some more magical stuff
        ...
    break;
    case Friends.Ian.getFullName():
        //Do some more magical stuff
        ...
    break;
    case Friends.Sarah.getFullName():
        //Do some more magical stuff
        ...
    break;
}

这对我来说似乎完全合法,但我在Eclipse中收到错误case expressions must be constant expressions。 我可以使用一组简单的if语句解决这个问题,但我想知道这个错误的原因以及如果允许的话,事情可能会向南发展。

注意:我无法更改Friends

的结构

2 个答案:

答案 0 :(得分:21)

如果我理解您的问题,您可以使用valueOf(String)之类的

String name = "Peter";
Friends f = Friends.valueOf(name);
switch (f) {
case Peter:
    System.out.println("Peter");
    break;
case Ian:
    System.out.println("Ian");
    break;
case Sarah:
    System.out.println("Sarah");
    break;
default:
    System.out.println("None of the above");
}

另外,这个

private Person(String fullName, String occupation) {
    this.fullName = fullName;
    this.occupation = occupation;
}

应该是

private Friends(String fullName, String occupation) {
    this.fullName = fullName;
    this.occupation = occupation;
}

因为Person!= Friends

修改

根据您的评论,您需要编写一个静态方法来获取正确的Friends实例,

    public static Friends fromName(String name) {
        for (Friends f : values()) {
            if (f.getFullName().equalsIgnoreCase(name)) {
                return f;
            }
        }
        return null;
    }

然后你可以用,

来调用它
    String name = "Peter von Reus";
    Friends f = Friends.fromName(name);

valueOf(String)将与枚举字段的名称匹配。所以" Ian"," Sarah"或者"彼得"。

答案 1 :(得分:11)

  

这对我来说似乎完全合法

嗯,不是 - 方法调用永远不会一个常量表达式。有关常量表达式的构成,请参阅JLS 15.28。案例值必须始终是一个常量表达式。

最简单的解决方法是使用Friend.fromFullName静态方法,它可能在Friend中看起来HashMap<String, Friend>。 (你当然不会 Friend中使用这个方法......它只是最传统的地方。)然后你可以切换enum而不是名字。

作为旁注,您的枚举名称应该是单数并且ALL_CAPS成员,Friend.PETER等。