2013-05-06 11 views
18

ジェネリックを理解してください。私はそうのような内部クラスなどの2つの列挙型を持っていると言う。その代わり、両方の列挙型は、インターフェイスを実装し、二度同じメソッドを実装する必要があるのJava:列挙型の汎用メソッド

public class FoodConstants{ 

    public static enum Vegetable { 

    POTATO,BROCCOLI,SQUASH,CARROT; 

    } 

    public static enum Fruit { 

    APPLE,MANGO,BANANA,GUAVA; 

    } 

} 

、私が何かを外部クラスのメソッドを持っていると思いますlike:

public <e> String getEnumString<Enum<?> e, String s){ 

for(Enum en: e.values()){ 

    if(en.name().equalsIgnoreCase(s)){ 
    return s; 
} 
} 
return null; 
} 

ただし、この方法はコンパイルされません。私がしようとしているのは、文字列値が列挙された値の名前であれば、どの列挙型であれ、野菜か果物かどうかを調べることです。 これが実際に冗長な方法であるかどうかに関わらず、私が(再)書き込みしようとしているものは何ですか?

基本的に私はこれをやりたい:あなたの助けを

public class FoodConstants{ 

     public static enum Vegetable { 

     POTATO,BROCCOLI,SQUASH,CARROT; 

     } 

     public static enum Fruit { 

     APPLE,MANGO,BANANA,GUAVA; 

     } 


     public <e> String getEnumString<Enum<?> e, String s){ 

      for(Enum en: e.values()){ 

       if(en.name().equalsIgnoreCase(s)){ 

      return s; 
      } 
     } 
    return null; 
     } 

    } //end of code 

感謝を。 -Alex

答えて

46
public static <E extends Enum<E>> 
String getEnumString(Class<E> clazz, String s){ 
    for(E en : EnumSet.allOf(clazz)){ 
    if(en.name().equalsIgnoreCase(s)){ 
     return en.name(); 
    } 
    } 
    return null; 
} 

元はいくつかの問題があります。

  1. をそれはあなたの質問は、あなたが使用したい示唆列挙 を表現する代わりに、クラスの列挙型のインスタンスを受け入れます。
  2. typeパラメータは使用されません。
  3. インスタンス名の代わりに入力を返します。大文字と小文字を区別しないバージョンのEnum.valueOf(String)を使用すると、インスタンスを返す方が便利です。
  4. インスタンスに対して静的メソッドを呼び出して、反復処理を実行できます。 EnumSetあなたのためのすべての反射物事を行います。
+6

Oh、clazz.getEnumConstants()は、EnumSet.allOf(clazz)の代わりに機能します。おそらくEnumSet.allOfがおそらくそれに関して実装されていることを考えると、多分もっと効率的ですが、そうでないかもしれません。 –

+0

@SebastianRedl、Odd。私はそれが1.5で利用できなかったと思ったが、それは明らかにそれである。 –

+5

@SebastianRedl: '.getEnumConstants()'は配列の内部配列のコピーを作成しなければならないので、 'EnumSet.allOf()'は '.getEnumConstants()'よりも効率的です。 'EnumSet'は内部実装の詳細を使用して内部配列を直接反復することができますが、配列が変更されるのを防ぐ方法はありません)。 – newacct