【发布时间】:2015-03-21 02:03:37
【问题描述】:
背景
考虑对象 Alice、Bob 和 Eve。在 Smalltalk 中,Alice 可以向 Bob 发送一条消息,然后 Bob 将消息委托给 Eve,而 Bob 不知道要委托的方法的名称(请参阅 unknown method call 的 Smalltalk 委托)。
问题
Java 可以通过像这样对 Alice 进行编码来部分地 emulate Smalltalk's behaviour:
public void methodName() {
Object bob = new Bob();
try {
((BobInterface)bob).methodName();
}
catch( ClassCastException e ) {
((BobInterface)bob).doesNotUnderstand( new Method( name ) );
}
}
这捕获了意图,但冗长且重复(每个方法编码一次)。即使生成代码也可能不切实际。
Java 8 引入了 lambda 表达式(参见 SO answer)。
问题
您如何对 Bob 进行编码,使得 Bob 未实现的所有方法调用都通过 Bob 从 Alice 传递给 Eve?
例如,以下变体应显示Received Alice's message!:
public class Alice {
public static void main( String args[] ) {
Bob bob = new Bob();
// Problematic line...
bob.listen();
}
}
public class Bob {
private Eve eve;
// When "bob.listen()" is called, this should be invoked...
public void doesNotUnderstand( Method m ) {
delegate( eve, m );
}
}
public class Eve {
public void listen() {
System.out.println( "Received Alice's message!" );
}
}
问题约束
- 欢迎使用 Lambda 表达式、反射或两者兼而有之。
- 第三方库(例如,字节码操作)和方面并不理想。
- Bob 不能实现多个方法,也不能继承任何方法。
- Alice 和 Bob 都不应包含重复代码。
想法
可以通过实现本地类来检索方法名称:
public class T {
public static void main( String args[] ){
class Local {};
String name = Local.class.getEnclosingMethod().getName();
System.out.printf( "%s%n", name );
}
}
相关
【问题讨论】:
标签: java methods delegates anonymous