martes, 19 de febrero de 2013

Punteros a funciones con Java

Buenas a todos!
El siguiente post es el resultado de una serie de experimentos matutinos que he llevado a cabo y que únicamente pretendían explorar nuevas formas de trabajar con grandes grupos de condicionales.

Supongamos que queremos ejecutar diferentes comandos en función de un parámetro entero. Es una situación bastante común que suele solventarse empleando un "switch case" o con condicionales del tipo "if ( param == value)", estos métodos clásicos son perfectos, pero su lógica es invariable, difícilmente dinámica, y además no podemos emplearla en diferentes puntos del programa.

Para generar los punteros a funciones he empleado un array de un tipo de clase definida como interface, esto me permite tener instancias con implementaciones distintas para cada función definida por esta interface.

public interface Function{
public void function();
}


Function[] options = {
new Function(){ public void function(){ System.out.println("Option 0"); } },
new Function(){ public void function(){ System.out.println("Option 1"); } },
new Function(){ public void function(){ System.out.println("Option 2"); } },
new Function(){ public void function(){ System.out.println("Option 3"); } }
};


options[2].function();


Tras realizar unas cuantas pruebas, (tampoco excesivamente exhaustivas), he podido concluir que en todos los casos se obtiene un rendimiento igual o superior al que obtendríamos empleando un "switch case". Además, en los casos en que tengamos muchas opciones, el código será mucho más legible, sobretodo si empleamos constantes para definir los índices que originan los distintos comportamientos. Otra ventaja es la posibilidad de reutilizar este tipo de estructura condicional entre distintas partes del programa, es tan simple como compartir el objeto "options".

Espero que os sea de ayuda o al menos que sirva para mostrar otra forma de pensar en las estructuras condicionales.

Un saludete a todos!

No hay comentarios:

Publicar un comentario