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());
    }

}