Re: [問題] 有沒有可能做到類似函式指標的功能?
[原文恕刪]
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)
→
05/20 00:00, , 1F
05/20 00:00, 1F
→
05/20 05:39, , 2F
05/20 05:39, 2F
推
05/20 14:38, , 3F
05/20 14:38, 3F
討論串 (同標題文章)
完整討論串 (本文為第 8 之 8 篇):