2017-04-11 14 views
1

以下の擬似コードで説明されているコンセプトを使用して特定のEnumにStringが含まれているかどうかを確認できます(私の例ではEnumのメソッドはありません) :私は列挙型クラスは、私がチェックする必要がありますを知っている必要があるためJavaのパラメータとしてEnum型の値を渡します

Enum Animal { 
    Dog, 
    Cat, 
    Human 
} 

public boolean CheckAnimalValid(String name){ 
    return Animal.contains(name)? true : false; 
} 

は、しかし、以前のように私は、各列挙クラスをCheckValidメソッドを実装する必要があります。私は、どのタイプ(またはキーワードを知りたい

Enum Animal { 
     Dog, 
     Cat, 
     Person 
    } 

Enum Plant { 
    Grass, 
    Flower, 
    Tree 
} 

public boolean CheckEnumValid(String name, what_should_I_do? enum){ 
    return enum.contains(name)? true : false; 
} 

:私が知りたい

が、私はこの方法で行うことができるように、関数のパラメータとして列挙型を渡すために任意の方法があります)私はwhat_should_I_doで使用する必要がありますか?前のコードの。私はジェネリックスを使うべきだと知っていますが、どうやって行うのか分かりません。ありがとう!

+1

私はまったく書きません。私は 'Enum.valueOf(Class enumType、String name)'を直接使用します。 NBあなたがそれをあなた自身に置かない限り、 'Enum'に' contains() 'メソッドはありません。 – EJP

+0

@ EJPご助言ありがとうございます。あなたは正しく、 'valueOf()'は私が必要とするものをほぼ達成することができます。しかし、私はまだジェネリックを使ってそれを達成する方法を知りたいです。私は 'public >'を試してみましたが、コンパイルできましたが、どのように関数を呼び出すのか分かりません。 'CheckValid(" test "、Plant);または' CheckValid( "test"、Plant.class); 'を使用することはできません。 – Alanight

+0

'Enum.valueOf(Class enumType、String name)' *すでに*ジェネリックで実現しています。あなたは何も必要ありません。 – EJP

答えて

5

Tの列挙型を返す静的メソッドEnum.valueOf(Class<T> enumType, String name)を使用できます。名前がその型の列挙定数に一致する場合それ以外の場合はIllegalArgumentExceptionがスローされます。

使用例:ブール値を返すメソッドに包ま

Enum.valueOf(Plant.class, "Flower"); 

public <T extends Enum<T>> boolean checkValid(Class<T> enumType, String name){ 
    try { 
     Enum.valueOf(enumType, name); 
     return true; 
    } catch(IllegalArgumentException e) { 
     return false; 
    } 
} 
+0

'Plant.class'は' enumType'でなければなりません。 'enumType'は本当に' Class > 'です。 – EJP

+0

@EJPあなたは正しいです、ありがとう! – Kapep

+0

@Kapepありがとう!私はあなたの方法を試しました、そして、それはまさに私が必要とするものです! – Alanight

0

あなたの代わりに汎用的なメソッドを実装する場合、Javaはあなたができるようcontrainsを使用可能にするとよいでしょう確かにPASSのみのENUMとインターフェイスのおかげで、コンパイル時に何が許可されているかを制限することができます:

この一般的なメソッドを定義します

public <T extends Enum<?> & ITag> void printEnum(T d) { 
     System.out.println(d.name()); 
    } 

タグインタフェース定義:

interface ITag { 
} 

今はメソッド内でのみ有効タグ列挙することができます:結果として

enum Color implements ITag { 
    RED, GREEN, BLUE 
} 

enum STATE { 
    ON, OFF 
} 

enum CONNECTION { 
    UDP, TCP 
} 

の方法がある場合、あなたは確認することができますコンパイル時に正しいパラメータを取る...

printEnum(Color.GREEN); //valid 
printEnum(STATE.OFF);// invalid The method printEnum(T)... is not applicable for the arguments.. 
printEnum(CONNECTION.UDP);// invalid The method printEnum(T)... is not applicable for the arguments.. 
printEnum("Green"); // invalid The method printEnum(T)... is not applicable for the arguments.. 
0

あなたのニーズを完全に理解しているかどうかはっきりしませんが、のいずれかを調べたいと思っていますenumString - これがいくつかあります。

まず、あなたが探しているものを定義しましょう。このようなものですか?

interface Lookup<S,T> { 
    T lookup(S s); 
} 

今、あなたこのような何かを行うにすべてのenumを調整することができます:

enum Animal implements Lookup<String,Animal>{ 
    Dog, 
    Cat, 
    Person; 
    Map<String,Animal> lookup = Arrays.stream(Animal.values()) 
      .collect(Collectors.toMap(e -> e.name(), e -> e)); 
    public Animal lookup(String name) { 
     return lookup.get(name); 
    } 
} 

をしかし、私はあなたのenumsすべてをハッキングすることなく、これをやりたい疑う - 痛みされるであろう。ヘルパーオブジェクトを使用する1つの方法があります。

class EnumLookup<E extends Enum<E>> implements Lookup<String,E> { 
    final Map<String,E> lookup; 

    public EnumLookup(Class<E> clazz) { 
     lookup = Arrays.stream(clazz.getEnumConstants()) 
       .collect(Collectors.toMap(e -> e.name(), e -> e)); 
    } 

    @Override 
    public E lookup(String s) { 
     return lookup.get(s); 
    } 
} 

今あなたが好きなときenumを調べるために、これらのものを作成することができます。

enum Plant { 
    Grass, 
    Flower, 
    Tree; 
} 

public void test() { 
    EnumLookup<Plant> lookup = new EnumLookup<>(Plant.class); 
    System.out.println("Tree -> "+lookup.lookup("Tree")); 
} 
関連する問題