在没有双重调度/访问者模式的情况下解决 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 的静态方法调度的主要内容,如果未能解决你的问题,请参考以下文章

单例模式双重检查(DCL)引发的多线程问题

双重返回上一个视图 - Swift

从单例模式说起

从单例模式说起

Java设计模式之所有创建型模式

有没有办法在不使用 gdata-java-client 的情况下访问日历的条目?