En op 23 augustus 2002 sprak (-ugene:
> One different way of doing it is to use the dispatch tables
> that are a builtin Perl feature:
>
> sub invoker {
> &{$Handler::{+shift} || sub {-1}};
> }
>
> sub Handler::edit {
> my $z = shift;
> print "in EditHandler, z=$z\n";
> return 1;
> }
>
> sub Handler::chmod {
> my $z = shift;
> print "in ChmodHandler, z=$z\n";
> return 2;
> }
In case anyone is interested in comparing languages,
I have hacked out an analogous Java solution using the
Java Reflection API. Needless to say, I much prefer
(-ugene's Perl solution. :)
import java.util.*;
import java.lang.reflect.*;
class itest3
{
public int edit(int z) {
System.out.println("in EditHandler, z="+z);
return 1;
}
public int chmod(int z) {
System.out.println("in ChmodHandler, z="+z);
return 2;
}
private int invoker(String name, int z) {
Method meth;
try {
meth = this.getClass().getMethod(name, new Class[]{int.class});
} catch (NoSuchMethodException e) {
return (-1);
}
Integer iret;
try {
iret = (Integer)meth.invoke(this, new Object[]{new Integer(z)});
} catch (Exception e) {
System.out.println("oops, method call failed");
return (-1);
}
return iret.intValue();
}
public void init() {
int rc = invoker("edit", 42);
System.out.println("rc="+rc);
rc = invoker("chmod", 99);
System.out.println("rc="+rc);
rc = invoker("fred", 7);
System.out.println("rc="+rc);
}
public static void main(String args[]) {
itest3 ii = new itest3();
ii.init();
}
}
/-\
Thread Previous
|
Thread Next