好吧,我想做这项工作
public static void main(String[] args) {
int cityId = 1234;
switch (cityId) {
case MOSCOW:
System.out.println("Moscow");
break;
case SOCHI:
break;
}
public enum Test {
MOSCOW,
NEWYORK,
SOCHI
}
所以我想将测试枚举与城市ID联系起来,这可能吗?这种情况的最佳模式是什么?
谢谢!
答案 0 :(得分:4)
您的代码唯一的问题是您需要启用Test
而不是int
。
即:
public static void main(String[] args) {
Test city = SOCHI;
switch (city) {
case MOSCOW:
System.out.println("Moscow");
break;
case SOCHI:
break;
}
public enum Test{
MOSCOW,
NEWYORK,
SOCHI
}
答案 1 :(得分:4)
您不能在交换机中混用它。您可以将Test
枚举传递给switch语句,或者在case语句中使用常量ID。
我建议在调用切换之前进行映射cityId <-> Test instance
并进行转换。
像
这样的东西Map<Integer, Test>` mapping = ...;
mapping.put(1234, Test.MOSCOW ); //note the use of autoboxing
...
mapping.get(cityId); //note the use of autoboxing
编辑:请注意,您可以将此映射放入枚举中,将cityId字段添加到枚举中,并自动填充values()
返回的数组中的映射,这与Chris的建议非常相似。
public enum Test {
MOSCOW(1001),
NEWYORK(1002),
SOCHI(1234);
private final int cityId;
private Test(int cityId) {
this.cityId = cityId;
}
...
private static Map<Integer, Test> mapping = new HashMap<Integer, Test>();
static { //executed when the class is loaded
for( Test t : values() ) {
mapping.put(t.getCityId(), t);
}
}
public static toTest(int cityId) {
return mapping.get(cityId);
}
}
这是我们经常为类似事情做的事情。
答案 2 :(得分:2)
您可以在枚举中添加cityId
字段:
public enum Test {
MOSCOW(1001),
NEWYORK(1002),
SOCHI(1234);
private final int cityId;
private Test(int cityId) {
this.cityId = cityId;
}
public int getCityId() {
return cityId;
}
public static Test valueOf(int cityId) {
/*
* Using linear search because there's only a small handful
* of enum constants. If there's a huge amount (say, >20),
* a map lookup is better.
*/
for (Test value : values()) {
if (value.cityId == cityId)
return value;
}
throw new IllegalArgumentException("Unknown city ID: " + cityId);
}
}
然后你确实可以打开枚举值:
switch (Test.valueOf(cityId)) {
case MOSCOW:
// ...
}