看板 java 關於我們 聯絡資訊
[原文恕刪] 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)
qrtt1:祈禱 closure 加進來 (夢ing) 05/20 00:00
AmosYang: Word has it that Java7 will have closure ... ;) 05/20 05:39
runtime:推 05/20 14:38