2012-06-11 77 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

这不是一种模式。这只是普通的代码,它明白枚举是类。我也经常这样做,但是我会命名enum Gender(没有s),并抛出IllegalArgumentException而不是返回null来与valueOf()一致。 –

+0

您在这里指的是什么“模式?”。这是事实,你有一个'get'方法? – templatetypedef

回答

2

我要说的是,看起来公平的有点像Multiton Pattern。如果你像erikb建议并使用地图而不是循环,我会说它就像Multiton模式一样

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

我会说这是一个非常,非常简单的解析器。