我有一个enum定义如下,其中包含一个静态函数fromString(String s),它类似于valueOf(String s)但不区分大小写。

enum Platform {
    TWITTER("TWITTER"), INSTAGRAM("INSTAGRAM"), UNKNOWN;

    private String value;

    Platform(String value) {
        this.value = value;
    }

    private static final Map<String, Platform> stringToEnumMap = new HashMap<>();

    static {
        for (Platform platform : values()) {
            stringToEnumMap.put(platform.toString().toLowerCase(), platform);
        }
    }

    public static Platform fromString(String symbol) {
        Platform platform = stringToEnumMap.get(symbol.toLowerCase());
        if (platform != null) {
            return platform;
        } else {
            return UNKNOWN;
        }
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return getValue();
    }

}


但是当我执行以下代码时

Platform platform = Platform.fromString("twitter");


我在生产中的少数设备上得到Platform.UNKNOWN退货。

任何的想法?

更新资料

symbol.toString()给出twitter

stringToEnumMap.toString()给出了


平台StringToEnumMap:{
twıtter= TWITTER,ınstagram= INSTAGRAM,
unknown = UNKNOWN}


如果仔细看,字母i在HashMap的键中是不同的,这就是字符串比较失败的原因。

ı中字母stringToEnumMap的十六进制值为0131,而其应为0069

为什么只有少数设备会发生这种情况?如何避免呢?

最佳答案

这似乎是一个肮脏的想法,请尝试清理您的项目,然后重新构建并运行。

更新
尝试用getOrDefault方法替换if语句:

public static Letter fromString(String symbol) {
    return stringToEnumMap.getOrDefault(symbol.toLowerCase(), UNKNOWN);
}

08-03 17:21