我有一个具有以下结构的枚举:
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
答案 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
等。