2012-05-28 41 views
2

我有一些枚舉,所有不同,我想創建一個函數,可以找到或不如果一個字符串是枚舉變量名稱之一(不知道它真的可以理解)。如何通過不同的枚舉作爲參數?

enum MYENUM { 
    ONE, 
    TWO; 
} 

enum MYENUM1 { 
    RED, 
    GREEN; 
} 

我想這樣做(這僅僅是例子,我的枚舉比較複雜):

if(isInEnum(MYENUM, "one")) ... 
if(isInEnum(MYENUM1, "one")) ... 

isinEnum功能(代碼是壞,它只是爲了理解):

boolean isinEnum(enum enumeration, String search) { 
    for(enum en : enumeration.values()){ 
    if(en.name().equalsIgnoreCase(search)) return true; 
    } 
    return false; 
} 

這種事情可能嗎?

根據我可以在網上閱讀的內容,我認爲不是,但也許有人有解決方案來做到這一點,而不是爲每個枚舉做一個循環。

回答

1

下面是一個使用反射的方式。 ..

public class EnumFinder { 

    public static <T extends Enum<T>> boolean isInEnum(Class<T> clazz, String name) { 
     for (T e : clazz.getEnumConstants()) { 
      if (e.name().equalsIgnoreCase(name)) { 
       return true; 
      } 
     } 

     return false; 
    } 

    public static void main(String[] argv) { 
     System.out.println(isInEnum(MYENUM.class, "one")); // true 
     System.out.println(isInEnum(MYENUM1.class, "one")); // false 
    } 
} 

你在你的回答中的嘗試其實非常接近。唯一的區別是Java需要定義類的實例才能在運行時動態回答有關未知類型的問題。

+0

非常感謝,它是完美的,正是我期待的 – Duffydake

+0

你的函數有一個警告,最好給Enum添加「」來刪除它:public static > boolean isInEnum(Class clazz,String名稱) – Duffydake

+0

更好:'>'。 –

0

你的問題有點難理解,但我想我明白了。

你可能會讓事情變得比自己強硬得多。

看看Java的地圖界面/數據結構(java.util中),看看是否移動你更接近你的解決方案:

java.util Interface Map<K,V>

如果不能,與任何腿部工作轉貼你我已經完成了,我會看看我能不能進一步幫助你。 ;-)

+0

謝謝,我已經知道地圖,它可能是一個替代方案,但它不是我想要的,我自己學習java,並嘗試有時這樣的奇怪的東西,我會編輯我的問題,並嘗試成爲更精確(英語不是我的語言,對於錯誤感到抱歉) – Duffydake

1

這可能不是最乾淨的解決方案,因爲它在正常的程序流程使用了異常,但肯定是短暫的,因爲它避免了循環:

boolean isinEnum(Class<T> enumClass, String search) { 
    try { 
     Enum.valueOf(enumClass, search); 
     return true; 
    } catch (IllegalArgumentException iae) { 
     return false; 
    } 
} 
+0

你的意思是catch(Exception e)'?或者說,這是一個Java 7的東西...... –

+0

@PaulBellora是的,你是對的 - 我最近做了太多的C#。 – dasblinkenlight

+0

對不起,在Andrew的答案之前我沒有看到你的答案,我在Exception(java中)讀到的第一件事情是「從來沒有收到回報」,但你的解決方案似乎也不錯,謝謝 – Duffydake