簡體   English   中英

Java enum.valueOf(String)和enum.class

[英]Java enum.valueOf(String) and enum.class

我有幾個如下的枚舉:

public enum Season {
    SPRING, SUMMER, AUTUM, WINTER
}

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

我正在嘗試為關注的問題寫一個通用方法。

private void doSomethingWithAnyEnum(Class enumClass,String checkThisProperty) 
{
  if(EnumUtils.isValidEnum(enumClass, checkThisProperty))
  {
    //here i should be able to call valueOf(String) method on enum
    //without bothering about the type coming in. 
  }
}

這樣我就可以像這樣調用此方法:

doSomethingWithAnyEnum(Days.class,"blah") ;
doSomethingWithAnyEnum(Seasons.class,"blah");

我被困在如何傳遞枚舉並使用同一件事在方法中使用它的類和名稱的問題上。 我嘗試使用simpleName()但在這里不起作用。 有沒有辦法做到這一點?

您可能要像這樣修改函數:

public <T extends Enum<T>> void doSomethingWithAnyEnum(Class<T> tClass, String name) {
    T t  = Enum.valueOf(tClass, name);
}

您的原始方法采用了隨機的Class enumClass類類型,該類型可以接受任何類。 將輸入類視為枚舉時,它將拋出運行時異常

來自Apache Commons的EnumUtils已經有一種方法可以做到這一點: getEnum 由於您已經將它用於isValidEnum ,因此也可以將其用於此。

您的方法簽名還應該使用泛型而不是原始類型來在編譯時強制執行,即使用枚舉而不是任何舊類調用doSomethingWithAnyEnum 我也為您修復了該問題。

private <E extends Enum<E>> void doSomethingWithAnyEnum(Class<E> enumClass,
                                                        String checkThisProperty)
{
    if (EnumUtils.isValidEnum(enumClass, checkThisProperty))
    {
        final E value = EnumUtils.getEnum(enumClass, checkThisProperty);
        System.out.println(value.name()); //or whatever else you want to do
    }
}

如果沒有方法簽名的更改,我可以使用

doSomethingWithAnyEnum(String.class, "hello")

而且只會在運行時失敗。 最好在編譯時進行檢查。

暫無
暫無

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

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