在没有双重调度/访问者模式的情况下解决 Java 的静态方法调度
Posted
技术标签:
【中文标题】在没有双重调度/访问者模式的情况下解决 Java 的静态方法调度【英文标题】:Work around Java's static method dispatching without Double Dispatch/Visitor patterns 【发布时间】:2010-09-27 02:45:49 【问题描述】:我正在使用一个提供这些方法的类Foo
:
String overloadedMethod(Object)
String overloadedMethod(Goo)
由于 Java 在 non-receiver 参数上静态分派,我不能只传递我的 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
(包含重载方法的类)中的代码?
【问题讨论】:
【参考方案1】:当然,您总是可以使用反射来找到适用的方法的最具体版本,但这可能很快就会变得很麻烦。
但是,如果这两个调用导致完全不同的行为,那么 Foo 要么被设计用于访问者模式(即双重调度),要么被破坏。
【讨论】:
【参考方案2】:您可以查看the Java MultiMethod Framework。它几乎是围绕您提议的内容的一个层,但至少它被抽象为一个逻辑模块,而不是您的责任?
(据我所知,如果不诉诸反射/黑客攻击,没有干净的方法可以做到这一点)
【讨论】:
以上是关于在没有双重调度/访问者模式的情况下解决 Java 的静态方法调度的主要内容,如果未能解决你的问题,请参考以下文章