2012-06-11 6 views
6

私はこのテクニックを頻繁に使いますが、私は何を呼び出すべきか分かりません。私はそれを連想列挙と呼びます。あれは正しいですか?この列挙パターンは何と呼びますか?

例:

public enum Genders { 

    Male("M"), Female("F"), Transgender("T"), Other("O"), Unknown("U"); 

    private String code; 

    Genders(String code) { 
     this.code = code; 
    } 

    public String getCode() { 
     return code; 
    } 

    public static Genders get(String code) { 
     for (Genders gender : values()) { 
      if (gender.getCode().equalsIgnoreCase(code)) { 
       return gender; 
      } 
     } 
     return null; 
    } 
} 
+1

私はあなたがそういうコードを書くことさえ知りませんでした! –

+6

パターンではありません。列挙型がクラスであることを理解しているのは普通のコードです。私もそれを頻繁に行っていますが、私は列挙型の名前を(sなし)とし、valueOf()と一貫性を持たせるためにnullを返す代わりにIllegalArgumentExceptionをスローします。 –

+0

具体的にここで "パターン?あなたは 'get'メソッドを持っているという事実はありますか? – templatetypedef

答えて

2

これは、Multiton Patternのような公正なビットです。あなたがerikbが示唆しているようにループしている代わりにマップを使用しているのであれば、それはと正確にはのMultiton Patternのようです。

3

私はこれを行うためのクラスのセットを持っていますが、私はEncodable

interface Encodable<T>{ 
    T getCode(); 
} 

public class EnumUtils{ 

     public static <U, T extends Enum<T> & Encodable<U>> T getValueOf(
      @Nonnull Class<T> enumClass, 
      @Nullable U code){ 

      for (T e : enumClass.getEnumConstants()){ 
       if (Objects.equal(e.getCode(), code)) 
        return e; 
      } 

      throw new IllegalArgumentException("No enum found for " + code); 
     } 
} 
1

以外のそれの名前を持っていない私はそれが非常にあると言うだろう、非常に単純なパーサー。

関連する問題