如果条件为真,则 else 正在执行
If condition is true even then else is executing
我有一个如下定义的 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()
给出这个
Platform StringToEnumMap: {
twıtter=TWITTER, ınstagram=INSTAGRAM,
unknown=UNKNOWN}
如果仔细观察,字母 i
在 HashMap 的键中是不同的,这就是字符串比较失败的原因。
stringToEnumMap
中字母ı
的十六进制值为0131,而应该是0069
为什么只在少数设备上发生这种情况?如何避免?
这似乎是一个肮脏的 ide 问题,请尝试清理您的项目,重新构建并 运行。
更新
尝试用 getOrDefault 方法替换您的 if 语句:
public static Letter fromString(String symbol) {
return stringToEnumMap.getOrDefault(symbol.toLowerCase(), UNKNOWN);
}
在我看来,不需要地图....也不需要新方法来做 valueOf() 能够做的事情...
看看这个实现..
enum ECase {
A, B, UNK;
public static ECase resolveEnumFromString(final String string) {
ECase r = null;
try {
r = ECase.valueOf(string.toUpperCase());
} catch (final IllegalArgumentException e) {
r = ECase.UNK;
}
return r;
}
}
您可以通过以下操作验证结果:
ECase d = null;
d = ECase.resolveEnumFromString("a");
System.out.println(d);
d = ECase.resolveEnumFromString("A");
System.out.println(d);
d = ECase.resolveEnumFromString("0");
System.out.println(d);
我能找到问题所在。经过一些仔细的记录后,我发现问题是这个 http://mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug.
显然 toLowerCase()
和 toUpperCase()
函数依赖于语言环境,因此您不能安全地使用它们进行不区分大小写的字符串比较。
所以你需要做的就是在这些函数的参数中传递英语语言环境,就像这样 -
toLowerCase(Locale.ENGLISH)
.
我有一个如下定义的 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()
给出这个
Platform StringToEnumMap: { twıtter=TWITTER, ınstagram=INSTAGRAM, unknown=UNKNOWN}
如果仔细观察,字母 i
在 HashMap 的键中是不同的,这就是字符串比较失败的原因。
stringToEnumMap
中字母ı
的十六进制值为0131,而应该是0069
为什么只在少数设备上发生这种情况?如何避免?
这似乎是一个肮脏的 ide 问题,请尝试清理您的项目,重新构建并 运行。
更新 尝试用 getOrDefault 方法替换您的 if 语句:
public static Letter fromString(String symbol) {
return stringToEnumMap.getOrDefault(symbol.toLowerCase(), UNKNOWN);
}
在我看来,不需要地图....也不需要新方法来做 valueOf() 能够做的事情...
看看这个实现..
enum ECase {
A, B, UNK;
public static ECase resolveEnumFromString(final String string) {
ECase r = null;
try {
r = ECase.valueOf(string.toUpperCase());
} catch (final IllegalArgumentException e) {
r = ECase.UNK;
}
return r;
}
}
您可以通过以下操作验证结果:
ECase d = null;
d = ECase.resolveEnumFromString("a");
System.out.println(d);
d = ECase.resolveEnumFromString("A");
System.out.println(d);
d = ECase.resolveEnumFromString("0");
System.out.println(d);
我能找到问题所在。经过一些仔细的记录后,我发现问题是这个 http://mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug.
显然 toLowerCase()
和 toUpperCase()
函数依赖于语言环境,因此您不能安全地使用它们进行不区分大小写的字符串比较。
所以你需要做的就是在这些函数的参数中传递英语语言环境,就像这样 -
toLowerCase(Locale.ENGLISH)
.