作者adrianshum (Alien)
看板java
标题Re: [问题] 有没有可能做到类似函式指标的功能?
时间Fri Jan 8 11:31:15 2010
※ 引述《ciphero (奶油焗蛋饺...:))》之铭言:
: 搜寻过之前的文章了,都没有关於函式指标的议题
: 所以只好上来发问...
: 想像以下程式码:
: Class ABC {
: public printA() {
: System.out.println("这是 printA().");
: }
: public printB() {
: System.out.println("这是 printB().");
: }
: public printC() {
: System.out.println("这是 printC().");
: }
: }
: Class Main {
: public static void main() {
: ABC abc = new ABC();
: if(argv[0]=="printA") abc.printA(); // 若参数为printA,则呼叫printA()
: else if(argv[0]=="printB") abc.printB(); // 若参数为printB,则呼叫printB()
: else if(argv[0]=="printC") abc.printC(); // 若参数为printC,则呼叫printC()
: }
: }
: 以上是一段简单易懂的程式码,想要呼叫什麽 Method,就输入那个方法当作参数就好
: 但是缺点是相当难以维护,
: 只要我新增了一个 printD() 方法,也就必须要在 main() 里面加上:
: else if(argv[0]=="printD") abc.printD();
: 这一段 code 才行,相当不方便
: 理想的程式,应该是新增了任何 printX() 之後,在 main() 里面并不需要另外做修改
: 这个目标,在 C 语言里可以经由函式指标来达到,但是 JAVA 没有办法这麽做
: 不知道是否有其他的解法?
虽然我觉得你这里应该从设计上着手,
比如利用 strategy/state pattern.
不过我也分享一下我自己工作上写的
一个类似 function ptr 的做法.
// 简化了的 code, 比如 try catch 那些我没有写出来
class MethodDelegate {
private Object target;
private Method targetMethod;
// factory method
public static MethodDelegate(Object target,
String methodName,
Class<?>... paramClasses) {
Method method = target.getClass().getMethod(methodName, paramClasses);
return new MethodDelegate(target, method);
}
private MethodDelegate(Object target, Method method) {
this.target = target;
this.method = method;
}
public Object invoke(Object... args) {
return targetMethod.invoke(target, args);
}
}
用的时候, 大概就
Foo foo = new foo();
MethodDelegate methodDelegate = MethodDelegate.create(foo, "methodA");
// 其他有的没的东西
methodDelegate.invoke();
最大问题是这个做法并不 refactoring-friendly
以前考虑过用一个特别一点的 factory method (有点像
easymock 之类的 mock 的原理), 效果类似:
MethodDelegate.create(foo).methodX(0, "");
这个做法应该比较 refactoring-friendly, 不过我还没有时间
试做 :P 有需要的话你自己想一想吧
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.155.236.82
※ 编辑: adrianshum 来自: 202.155.236.82 (01/08 11:41)
1F:推 dahanhsi:请问这边的create定义在哪? 01/08 18:33