2012-06-11 9 views
6

Używam tej techniki często, ale nie jestem pewien, jak to nazwać. Nazywam to asocjacyjnym wyliczeniem. Czy to jest poprawne?Co by nazwał ten wzór enum?

Przykład:

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

Nie wiedziałem nawet, że możesz napisać taki kod! –

+6

To nie jest wzór. Jest to zwykły kod, który rozumie, że wyliczenia są klasami. Robię to również często, ale nazwałbym enum Płeć (bez s) i wyrzucił wyjątek IllegalArgumentException zamiast zwracać wartość null, aby być zgodnym z valueOf() –

+0

. Co konkretnie nazywasz tutaj "wzorem"? Czy to jest fakt, że masz metodę "get"? – templatetypedef

Odpowiedz

2

Powiedziałbym, że wygląda trochę jak Multiton Pattern. Jeśli zrobisz to, co sugeruje erikb i użyjesz mapy zamiast pętli, powiedziałbym, że jest to dokładnie, podobnie jak wzór wielotonowy.

3

Mam zestaw klas dla tej operacji, ale nie mam na to nazwisko inne niż 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

Powiedziałbym, że jest to bardzo , bardzo prosty parser.