Actualmente, tengo un montón de clases de Java que implementan una interfaz Processor
, lo que significa que todas tienen un método processRequest(String key)
. La idea es que cada clase tiene un miembro de pocos (por ejemplo, < 10) Strings
, y cada uno de esos mapas a un método en el que la clase a través del método processRequest
, así:¿Cómo puedo asignar una cadena a una función en Java?
class FooProcessor implements Processor
{
String key1 = "abc";
String key2 = "def";
String key3 = "ghi";
// and so on...
String processRequest(String key)
{
String toReturn = null;
if (key1.equals(key)) toReturn = method1();
else if (key2.equals(key)) toReturn = method2();
else if (key3.equals(key)) toReturn = method3();
// and so on...
return toReturn;
}
String method1() { // do stuff }
String method2() { // do other stuff }
String method3() { // do other other stuff }
// and so on...
}
Usted consigue la idea.
Esto funcionaba bien para mí, pero ahora necesito un mapeo accesible desde el tiempo de ejecución de la clave a la función; no todas las funciones en realidad devuelven una Cadena (algunas vuelven vacías) y necesito acceder dinámicamente al tipo de retorno (usando reflexión) de cada función en cada clase para la que hay una clave. Ya tengo un administrador que conoce todas las claves, pero no la asignación de la clave a la función.
Mi primer instinto fue reemplazar este mapeo usando if-else
declaraciones con un Map<String, Function>
, como podría hacerlo en Javascript. Pero Java no admite funciones de primera clase, así que no tengo suerte allí. Probablemente podría desenterrar una biblioteca de terceros que me permita trabajar con funciones de primera clase, pero aún no he visto ninguna, y dudo que necesite una biblioteca completamente nueva.
También pensé en poner estos String
teclas en una matriz y utilizando la reflexión para invocar los métodos por su nombre, pero veo dos inconvenientes de este método:
- Mis llaves tendrían que ser el mismo nombre que el método - o ser nombrado de una manera particular y consistente para que sea fácil asignarlos al nombre del método.
- Esto parece mucho más lento que las declaraciones
if-else
que tengo ahora. La eficiencia es algo preocupante porque estos métodos tienden a recibir llamadas con bastante frecuencia, y quiero minimizar la sobrecarga innecesaria.
TL; DR: Estoy buscando una manera limpia y mínima para mapear un String
a algún tipo de objeto Function
que pueda invocar y llamar (algo así como) getReturnType()
en. No me importa especialmente utilizar una biblioteca de terceros si realmente se ajusta a mis necesidades. Tampoco me molesta usar la reflexión, aunque preferiría evitar el uso de la reflexión cada vez que realizo una búsqueda de métodos, tal vez usando alguna estrategia de almacenamiento en caché que combine el Map
con la reflexión.
¿Piensas en una buena forma de obtener lo que quiero? ¡Aclamaciones!
¿No podría hacer Cadena al método (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html)? Luego puede almacenar en caché los métodos que necesita para ejecutar. –
@Chris - Sí, básicamente es a donde me dirigía al final de mi pregunta. –
Hecho :) :) :) –