作者ewn (...)
看板java
标题Re: [问题] 有没有可能做到类似函式指标的功能?
时间Wed May 19 22:35:52 2010
[原文恕删]
C的函式指标的确是很好用的东西
在JAVA里应该也只能用物件来模拟吧
之前的回文已经有提到解法了
因为使用Reflection会有效率问题
所以,能够避免我都会尽量避免
补上我的解法(类似之前回文的)
首先,一定会有函式的介面(泛不泛型都可以):
interface Function<T> {
T invoke(Object... args);
}
然後,就是几个实作的函式如下:
class FunctionA implements Function<String> {
public String invoke(Object... args) {
System.out.println("this is printA.");
return "function printA.";
}
}
class FunctionB implements Function<String> {
public String invoke(Object... args) {
System.out.println("this is printB.");
return "function printB.";
}
}
再来,就是要怎麽去对应他们了
还要能够在runtime修改这些函数的对应,如下:
class FunctionMap {
private static Map<String, Function> funcs;
static {
funcs = new HashMap<String, Function>();
// 初始化可以用Reflection的方式
// 或是用读取设定档的方式,或者写死,随便你
funcs.put("funcA", new FunctionA());
funcs.put("funcB", new FunctionB());
}
public static Function get(String funcName) {
return funcs.get(funcName);
}
public static <R> Function<R> get(String funcName, Class<R> returnType) {
return (Function<R>) funcs.get(funcName);
}
// 这边要做同步的控管,自理
public static void put(String funcName, Function func) {
funcs.put(funcName, func);
}
}
至於使用,就像这样:
Function func = FunctionMap.get("funcA");
or
Function<String> func = FunctionMap.get("funcA", String.class);
差别只在於泛型,看你需不需要compiler帮你检查型别了
然後:
result = func.invoke();
or
result = func.invoke(参数...);
至於修改就像操作map:
FunctionMap.put("funcC", new Function<String>() {
public String invoke(Object... args) {
System.out.println("this is printC.");
return "function printC.";
}
});
大致如上,感谢看完这一长串
warning、泛型的细节就不罗嗦了
有错请指正
※ 编辑: ewn 来自: 114.42.168.80 (05/19 22:39)
1F:→ qrtt1:祈祷 closure 加进来 (梦ing) 05/20 00:00
2F:→ AmosYang: Word has it that Java7 will have closure ... ;) 05/20 05:39
3F:推 runtime:推 05/20 14:38