切换枚举值:大小写表达式必须是常量表达式

2022-09-04 05:31:37

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

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;
    }
}

我现在想用它来确定,如果一个变量与某个变量相关联:switchnameenum

//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中得到了错误。我可以通过一组简单的if语句来解决这个问题,但我想知道这个错误的原因,以及如果允许的话,事情会如何发展。case expressions must be constant expressions

注意:我无法更改Friends


答案 1

如果我理解你的问题,你可以使用喜欢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;
}

因为 != .PersonFriends

编辑

根据您的注释,您需要编写一个静态方法来获取正确的实例,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)将与枚举字段的名称匹配。所以“伊恩”,“莎拉”或“彼得”。


答案 2

这对我来说似乎是完全合法的

好吧,它不是 - 方法调用从来都不是常量表达式。请参阅 JLS 15.28 了解常量表达式的构成要素。事例值必须始终是常量表达式。

最简单的解决方法是使用一个静态方法,该方法可能会在 .(当然,您不必使用该方法...只是那将是最传统的地方。然后,您可以切换枚举而不是名称。Friend.fromFullNameFriendHashMap<String, Friend>Friend

作为旁注,您的枚举名称应为单数,并且带有成员,因此等。ALL_CAPSFriend.PETER