2012-06-11 19 views
6

Uso esta técnica con frecuencia, pero no estoy seguro de cómo llamarla. Yo lo llamo enumeraciones asociativas. ¿Es eso correcto?¿Cómo se llamaría este patrón enum?

Ejemplo:

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

¡Ni siquiera sabía que pudiera escribir código así! –

+6

No es un patrón. Es solo un código normal que entiende que las enumeraciones son clases. También lo hago con frecuencia, pero nombraría el género enum (sin s), y arrojaría una IllegalArgumentException en lugar de devolver null para que concuerde con valueOf() –

+0

¿A qué se refiere específicamente aquí como el "patrón?" ¿Es el hecho de que tienes un método 'get'? – templatetypedef

Respuesta

2

Yo diría que se parece un poco al Multiton Pattern. Si haces lo que sugiere erikb y usas un mapa en lugar de un bucle, diría que es exactamente como el patrón Multiton.

3

Tengo un conjunto de clases para hacer esto, pero no tengo un nombre para ella que no sea 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

yo diría que es una muy , analizador muy simple.

Cuestiones relacionadas