代码之家  ›  专栏  ›  技术社区  ›  Yang Meyer

解决Java的静态方法调度问题,无需双调度/访问者模式

  •  3
  • Yang Meyer  · 技术社区  · 17 年前

    我正在使用一个类 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 回复  |  直到 17 年前
        1
  •  3
  •   Joachim Sauer    17 年前

    当然,你总是可以使用反射来找到最具体的方法版本,但这可能会很快变得很麻烦。

    但是,如果这两个调用导致完全不同的行为,那么Foo要么被设计为在访问者模式中使用(即具有双分派),要么就被破坏了。

        2
  •  2
  •   Martin    17 年前

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

    (据我所知,如果不诉诸于反思/黑客事件,就没有一种干净的方法可以做到这一点)

    推荐文章