如果条件为真,那么即使其他正在执行

时间:2017-03-01 18:37:37

标签: java android-studio if-statement enums static-methods

我的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}

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

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

为什么这只发生在少数设备上?如何避免呢?

3 个答案:

答案 0 :(得分:1)

这似乎是一个肮脏的ide问题,尝试清理你的项目,再次构建和运行。

<强>更新 尝试用getOrDefault方法替换你的if语句:

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

答案 1 :(得分:0)

在我的意见中,不需要地图......也不需要采用新方法来做 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);

答案 2 :(得分:0)

我能够找到问题所在。经过一些仔细的记录后,我发现问题是http://mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug

显然toLowerCase()toUpperCase()函数依赖于语言环境,因此您无法安全地使用它们进行不区分大小写的字符串比较。 所以你需要做的就是在这些函数的参数中传递英语语言环境,如下所示 -

toLowerCase(Locale.ENGLISH)