Java Switch语句:number to enum value/1002=MyEnum.NewYorkID

Java Switch语句:number to enum value/1002=MyEnum.NewYorkID,java,design-patterns,enums,Java,Design Patterns,Enums,好吧,我想让这一切顺利 public static void main(String[] args) { int cityId = 1234; switch (cityId) { case MOSCOW: System.out.println("Moscow"); break; case SOCHI: break; } public enum Test {

好吧,我想让这一切顺利

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联系起来,这可能吗?这种情况下的最佳模式是什么


谢谢大家!

代码的唯一问题是需要打开
Test
而不是
int

即:


代码的唯一问题是需要打开
Test
而不是
int

即:


你不能把它和开关混在一起。要么将
Test
enum传递到switch语句中,要么在case语句中使用常量id

我建议在调用开关之前,先创建一个映射
cityId测试实例
,并进行转换

差不多

Map<Integer, Test>` mapping = ...;
mapping.put(1234, Test.MOSCOW ); //note the use of autoboxing

...

mapping.get(cityId); //note the use of autoboxing

这是我们经常做的类似事情。

你不能在开关中混合使用。要么将
Test
enum传递到switch语句中,要么在case语句中使用常量id

我建议在调用开关之前,先创建一个映射
cityId测试实例
,并进行转换

差不多

Map<Integer, Test>` mapping = ...;
mapping.put(1234, Test.MOSCOW ); //note the use of autoboxing

...

mapping.get(cityId); //note the use of autoboxing

这是我们经常做的类似事情。

您可以在枚举中添加一个
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:
    // ...
}

您可以在枚举中添加
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:
    // ...
}

从什么意义上说,你希望这能起作用?1234的相关性是什么?您希望它在什么意义上起作用?1234的相关性是什么?大多数情况下(在我们工作的枚举中),根本没有足够的枚举常量使map方法值得使用,但我同意map方法有一定的时间和地点。:-)@克里斯:是的,没错。然而,我们希望有一个通用的方法,因此我们也希望考虑大的枚举,因此映射(事实上,我们有一个注册表,它是一个映射的映射,允许我们寻找一个通用接口的不同枚举实现)-我还假设会有更多的城市:)大部分时间(在我们工作时使用的枚举中)根本没有足够的枚举常量使map方法值得,但我同意map方法有一定的时间和地点。:-@Chris,是的。然而,我们希望有一个通用的方法,因此我们也希望考虑大的枚举,因此地图(事实上,我们有一个注册表,它是一个地图地图,允许我们寻找一个通用接口的不同枚举实现)-我还假设还有更多的城市:)