我有一个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);
}