Re: [問題] 有沒有可能做到類似函式指標的功能?

看板java作者 (...)時間15年前 (2010/05/19 22:35), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串8/8 (看更多)
[原文恕刪] 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
祈禱 closure 加進來 (夢ing)
05/20 00:00, 1F

05/20 05:39, , 2F
Word has it that Java7 will have closure ... ;)
05/20 05:39, 2F

05/20 14:38, , 3F
05/20 14:38, 3F
文章代碼(AID): #1By_TAeU (java)
討論串 (同標題文章)
文章代碼(AID): #1By_TAeU (java)