Mostrando entradas con la etiqueta Enum. Mostrar todas las entradas
Mostrando entradas con la etiqueta Enum. Mostrar todas las entradas

lunes, 14 de marzo de 2016

Enums: Campos de arreglo

Usando arreglos en campos del enum. En este ejemplo utilizado para agragar los lenguajes soportados por una tienda.

public enum StoreCode {
 
    BR(Language.pt_BR, Subdomain.BR, Language.pt_BR, Language.en),
    US(Language.en_US, Subdomain.WWW, Language.en_US)
    // ....
    ;

    private final Language defaultLanguage;
    private final Language [] supportedLanguages;    
    private final Subdomain subdomain;
    
    StoreCode(Language defaultLanguage, Subdomain subdomain, Language ... supportedLanguages) {
        this.defaultLanguage = defaultLanguage;        
        this.subdomain = subdomain;
        this.supportedLanguages = supportedLanguages;
    }

    public Language getDefaultLanguage() {
        return defaultLanguage;
    }

    public Subdomain getSubdomain() {
        return subdomain;
    }

    public Language[] getSupportedLanguages() {
        return supportedLanguages;
    }
}

viernes, 12 de febrero de 2016

Enums: Buscando valores de manera invertida

Un tip interesante para simplificar la búsqueda en un enum por alguna de sus propiedades. En este ejemplo tenemos un enum para tiendas de países. Una de sus propiedades es el subdominio. Si queremos tener un método para retornar el valor de la tienda usando como entrada el subdominio, podemos preparar un mapa de manera estática donde la llave es el subdominio.

public enum CountryStore {

    AD(Language.en, Measures.METRIC, Subdomain.AND),
    AE(Language.en, Measures.METRIC, Subdomain.AE),
    AF(Language.en, Measures.METRIC, Subdomain.AF),
    ...

    private final Language defaultLanguage;
    private final Measures defaultMeasure;
    private final Subdomain subdomain;    

    CountryStore(Language defaultLanguage, Measures defaultMeasure, Subdomain subdomain) {
        this.defaultLanguage = defaultLanguage;
        this.defaultMeasure = defaultMeasure;
        this.subdomain = subdomain;
    }

    private final static Map<String, StoreCode> subdomainMap;

    static {
        // Reverse lookup preparation for subdomains.        
        Map<String, CountryStore> smap = new HashMap<String, CountryStore>();
        
        for(CountryStore store: CountryStore.values()) {
            smap.put(store.getSubdomain().name().toLowerCase(), store);
        }
        subdomainMap = Collections.unmodifiableMap(smap);
    }

    public static CountryStore fromSubdomain(String subdomain) {
        return subdomain == null ?  null :  subdomainMap.get(subdomain.toLowerCase());
    }

}


miércoles, 14 de agosto de 2013

Java: Conviertiendo String a Enum


A veces es necesario convertir un valor String a un Enum porque quizás el valor lo tenemos en la base de datos como un String, pero deseamos manipularlo en el código como un Enum.

En el siguiente código muesto como obtener el valor Enum de un String. Básicamente se agrega un método estático a la clase Enum que retorna el valor específico mediante una iteración de todos sus valores para comparar el valor String con el pasado por parámetro. Si no se encuentra o se pasa un valor nulo, se retorna una excepción de argumento inválido.


public enum Volcano {

 IRAZU("Irazu"), POAS("Poas"), ARENAL("Arenal"), RINCON_DE_LA_VIEJA("Rincon de la vieja");

 private String name;

 private Volcano(String name) {
  this.name = name;
 }

 public static Volcano fromString(String name) {
  if (name == null) {
   throw new IllegalArgumentException();
  }
  for (Volcano volcano : values()) {
   if (name.equalsIgnoreCase(volcano.getName())) {
    return volcano;
   }
  }
  // Passed string value does not correspond to a valid enum value.
  throw new IllegalArgumentException();
 }

 public String getName() {
  return this.name;
 }

 public static void main(String[] args) {
  Volcano volcano1 = Volcano.fromString("Poas");
  System.out.println(volcano1);

  Volcano volcano2 = Volcano.fromString("rincon de la vieja");
  System.out.println(volcano2);

  Volcano volcano3 = Volcano.fromString("Fuji");
 }
}

Salida:


POAS
RINCON_DE_LA_VIEJA
java.lang.IllegalArgumentException
 at com.bodybuilding.common.enums.Volcano.fromString(Volcano.java:22)
 at com.bodybuilding.common.enums.Volcano.main(Volcano.java:36)