簡體   English   中英

如果條件為真,則其他正在執行

[英]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()給出了

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

如果仔細看,字母i在HashMap的鍵中是不同的,這就是字符串比較失敗的原因。

信hexvalue ıstringToEnumMap是0131,而應該是0069

為什么只有少數設備會發生這種情況? 如何避免呢?

這似乎是一個骯臟的想法,請嘗試清理您的項目,然后重新構建並運行。

更新嘗試用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM