在没有Double Dispatch / Visitor模式的情况下解决Java的静态方法调度问题

时间:2008-12-16 09:41:25

标签: java overloading multiple-dispatch method-dispatch dynamic-dispatch

我正在使用提供这些方法的类Foo

String overloadedMethod(Object)
String overloadedMethod(Goo)

由于Java静态调度非接收者参数,我不能只传递valueObject,但可能有动态类型Goo)并且依赖于JVM动态选择“正确”的方法。

这是我目前(丑陋)的解决方法:

Object value = ...;
Foo foo = new Foo();
if (value instanceof Goo) {
    Goo gooValue = (Goo) value;
    return foo.overloadedMethod(gooValue); // -> overloadedMethod(Goo)
} else {
    return foo.overloadedMethod(value);    // -> overloadedMethod(Object)
}

有没有更好的方法来执行此操作而无需修改Foo (包含重载方法的类)中的代码?

2 个答案:

答案 0 :(得分:3)

当然,您总是可以使用反射来查找适用的方法的最具体版本,但这可能会很快变得毛茸茸。

但如果这两个调用导致完全不同的行为,那么Foo要么被设计成用于访问者模式(即双重调度),要么被破坏。

答案 1 :(得分:2)

您可以查看the Java MultiMethod Framework。它几乎是你提出的一个层面,但至少它被抽象成一个不是你的责任的逻辑模块?

(据我所知,如果不采用反射/实例黑客攻击,没有干净的方法可以做到这一点)