【发布时间】:2011-02-14 07:19:27
【问题描述】:
目前,我有一堆实现Processor 接口的Java 类,这意味着它们都有一个processRequest(String key) 方法。这个想法是每个类都有一些(例如,Strings,并且每个都通过processRequest 方法映射到该类中的一个方法,如下所示:
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...
}
你明白了。
这对我来说工作得很好,但现在我需要一个运行时可访问的从键到函数的映射;并非每个函数实际上都返回一个字符串(有些返回 void),我需要动态访问每个有键的类中每个函数的返回类型(使用反射)。我已经有一个了解所有键的经理,但不了解从键到功能的映射。
我的第一个直觉是用 Map<String, Function> 替换使用 if-else 语句的映射,就像我在 Javascript 中所做的那样。但是,Java 不支持一流的函数,所以我不走运。我可能会挖掘一个第三方库来让我使用一流的函数,但我还没有看到任何东西,我怀疑我是否需要一个全新的库。
我也想过将这些 String 键放入一个数组中,并使用反射按名称调用方法,但我看到此方法有两个缺点:
- 我的键必须与方法命名相同 - 或以特定、一致的方式命名,以便轻松将它们映射到方法名称。
- 这似乎比我现在的
if-else语句慢得多。效率是一个问题,因为这些方法往往会被非常频繁地调用,我想尽量减少不必要的开销。
TL; DR: 我正在寻找一种干净、开销最小的方法来将String 映射到某种Function 对象,我可以调用和调用(类似于)getReturnType() on。如果它真的符合我的需要,我并不特别介意使用第 3 方库。我也不介意使用反射,但我强烈希望避免在每次进行方法查找时都使用反射——也许使用一些将Map 与反射相结合的缓存策略。
想出一种获得我想要的东西的好方法吗?干杯!
【问题讨论】:
-
你不能做字符串到方法(java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html)吗?然后就可以缓存需要执行的方法了。
-
@Chris - 是的,这基本上就是我在问题结束时的目标。
标签: java string reflection functional-programming