關於 String 轉 Enum 類型,適用所有場景

問題:

爲了讓開發中的代碼可讀性增加,可以使用 Enum 類型,但是 String 轉 Enum 類型需要分情況討論。網上過多的解答都是部分情況,現記錄如下:

情況一

假設定義瞭如下的enum(枚舉):

public enum Blah {
    A, B, C, D
}

已知枚舉對應的String值,希望得到對應的枚舉值。例如,已知"A",希望得到對應的枚舉——Blah.A,應該怎麼做?

使用 Blah.valueOf(“A”) 將會得到 Blah.A 類型

靜態方法valueOf() 和 values() 不存在於源碼中,而是在編譯時創建,我們也可以在JavaDoc查看到它們,比如 Dialog.ModalityTyp 就中出現這兩個方法。

情況二

當文本和枚舉值不同時

public enum DetectionClass {
 	真實性("authenticity"),
    完整性("integrity"),
    可用性("usability"),
    安全性("security");


 public static DetectionClass fromString(String text) {
        for (DetectionClass d : DetectionClass.values()) {
            if (d.getValue().equalsIgnoreCase(text)) {
                return d;
            }
        }
        throw new IllegalArgumentException("No constant with text " + text + " found");
    }
}

fromString 方法就可以將一個 String 轉化爲對應的 Enum 類

情況三

在情況二 基礎上,如果 DetectionClass 基礎了一個公共父類,則可以在公共父類中添加如下的一個工具方法:

static EnumService getEnum(Class<? extends EnumService> clazz, String valueText) {
        try {
            Method method = clazz.getMethod( "values" );
            EnumService[] inter = (EnumService[]) method.invoke( null, null );
            for (EnumService value : inter) {
                if (value.getValue().equals( valueText )) {
                    return value;
                }
            }
            return null;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }

EnumService是 enum 的公共父類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章