Comencemos con un pequeño ejemplo donde queremos crear un enumerado bien simple para representar cuatro colores. Quedaría de la siguiente forma:
public enum Color { BLUE, RED, BLACK, WHITE }Ahora definamos un método en el enumerado para describir el tipo de cada uno de estos colores (claro y oscuro):
public enum Color { BLUE, RED, BLACK, WHITE; public String getType() { return "dark"; } }Hasta aquí todo perfecto a no ser porque, en el caso específico del color blanco, su tonalidad es clara y no oscura, así que habría que hacer una pequeña modificación:
public enum Color { BLUE, RED, BLACK, WHITE; public String getType() { return this == WHITE ? "light" : "dark"; } }Con la condicional (operador ternario) introducida en el método "getType", solamente para el color blanco se imprimirá "light", mientras que el resto será "dark". Para probar el ejemplo anterior podemos ejecutar lo siguiente:
public static void main(String[] args) { System.out.println(Color.BLUE.getType()); System.out.println(Color.RED.getType()); System.out.println(Color.BLACK.getType()); System.out.println(Color.WHITE.getType()); }Lo cual imprimirá en la pantalla:
dark dark dark lightTodo bien hasta aquí, pero ahora es cuando viene la parte interesante. El ejemplo anterior obviamente es extremadamente simple, lo cual no siempre se cumple en todo momento. Pudiera darse el caso que las reglas que gobiernen nuestro enumerado sean mucho más complejas, lo cual provoque que nuestro método "getType" tenga que incluir muchas más condicionales teniendo en cuenta el tipo de enumerado en cuestión. Del mismo modo, si pensamos en un escenario orientado a objetos, la tonalidad del color blanco no es más que un caso especial dentro de nuestro enumerado, lo cual se traduce a un comportamiento polimórfico del mismo. ¿Cómo se resuelve este problema? Simplemente redefiniendo el método "getType" para la instancia (valor del enumerado) correspondiente:
public enum Color { BLUE, RED, BLACK, WHITE { public String getType() { return "light"; } }; public String getType() { return "dark"; } }Si prestamos atención veremos que en el enumerado anterior el valor "WHITE" está redefiniendo el método "getType" para retornar el valor correcto, lo cual evita que tengamos que utilizar condicionales en el método general. Si volvemos a ejecutar nuestro proyecto, veremos que el resultado seguirá siendo correcto, imprimiéndose "light" solamente en el caso del valor "WHITE". Haciendo uso de esta posibilidad, nuestro código será mucho más limpio, flexible y fácil de mantener.
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.