不使用双重分派/访问者模式解决Java静态方法分派的方法

3

我正在使用一个名为 Foo 的类,它提供以下方法:

String overloadedMethod(Object)
String overloadedMethod(Goo)

由于Java在静态分派时基于非接收器参数,因此我不能仅仅传递我的value(它是一个Object,但可能有动态类型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个回答

3

当然,您始终可以使用反射来查找适用的最具体版本的方法,但这可能会变得非常棘手。

但如果这两个调用导致完全不同的行为,则 Foo 要么被设计为在访问者模式下使用(即使用双重分派),要么是有问题的。


2
您可以看一下Java MultiMethod Framework。它基本上是一个围绕您提出的内容的层,但至少它被抽象成一个逻辑模块,不是您的责任。
(据我所知,没有干净的方法可以做到这一点,而不必诉诸反射/ instanceof黑客攻击)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接