Asignación de una cadena a un valor de enumeración, es normalmente lo que el método estático valueOf
está haciendo por tú.Entonces, si quieres lograr esto con el uso de sinónimos, tendrás que desarrollar algo similar. Sin embargo, no queremos dar la impresión de que podemos anular un método estático, por lo que simplemente lo nombramos diferente para este fin: fromString
debería ser apropiado.
public enum Language {
ENGLISH("eng", "en", "en_GB", "en_US"),
GERMAN("de", "ge"),
CROATIAN("hr", "cro"),
RUSSIAN("ru"),
BELGIAN("be",";-)");
static final private Map<String,Language> ALIAS_MAP = new HashMap<String,Language>();
static {
for (Language language:Language.values()) {
// ignoring the case by normalizing to uppercase
ALIAS_MAP.put(language.name().toUpperCase(),language);
for (String alias:language.aliases)
ALIAS_MAP.put(alias.toUpperCase(),language);
}
}
static public boolean has(String value) {
// ignoring the case by normalizing to uppercase
return ALIAS_MAP.containsKey(value.toUpperCase());
}
static public Language fromString(String value) {
if (value == null) throw new NullPointerException("alias null");
Language language = ALIAS_MAP.get(value);
if (language == null)
throw new IllegalArgumentException("Not an alias: "+value);
return language;
}
private List<String> aliases;
private Language(String... aliases) {
this.aliases = Arrays.asList(aliases);
}
}
Como ventaja de este tipo de aplicación se puede, como se ha demostrado, también implementar fácilmente el método estático has
para probar si un alias dado es parte del conjunto de valor de enumeración. Al mismo tiempo, hemos aplicado algunas buenas convenciones de nomenclatura:
- la enumeración valores van en mayúsculas, para indicar que en realidad son estáticas (instancias finales Singleton).
- al mismo tiempo, también colocamos todas las demás terminaciones estáticas en mayúsculas.
Tenga en cuenta que no tenemos que repetir el nombre del valor de enumeración en sí: siempre tenemos en cuenta su propio nombre automáticamente (se agrega a la ALIAS_MAP), y encima se normaliza todo a mayúsculas para que sea sensible a mayúsculas .
Parece grande, pero durante el uso de la enumeración, se ve bastante:
public void main() {
Language myLanguage = Language.fromString("en_GB");
if (myLanguage == Language.ENGLISH) {
System.out.println("Yes, I know, you understand English!");
}
}
El contenedor de respaldo para los alias es una Map
, un HashMap
Para ser más específicos. El HashMap
proporciona una ruta de acceso rápido a los alias, y también es fácil de cultivar. Cada vez que pensamos en 'indexar' algo, probablemente un HashMap
debería ser nuestra primera opción.
Tenga en cuenta que para un uso transparente, almacenamos el nombre de la constante enum (recuperada a través del método name()
) y todos los alias. Podríamos haber implementado esto de manera diferente al primero intentar hacer la búsqueda utilizando el método estático valueOf
incorporado. Es una opción de diseño, pero que potencialmente podría tener que lidiar con excepciones adicionales, etc.
I 'd recomendamos que vea mis artículos: http://java.dzone.com/articles/enum-tricks-customized-valueof y http://java.dzone.com/articles/enum-tricks-hierarchical-data Aunque no estoy seguro de entender exactamente qué es lo que realmente quiere, creo que al menos uno de estos artículos contiene la respuesta a su pregunta. – AlexR