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

围绕Java的静态方法调度而不使用双调度/访问者模式

  •  2
  • Yang Meyer  · 技术社区  · 16 年前

    我在上课 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)
    }
    

    有更好的方法吗 不修改中的代码 (包含重载方法的类)?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Joachim Sauer    16 年前

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

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

        2
  •  2
  •   Martin    16 年前

    你可以看看 the Java MultiMethod Framework . 它基本上是围绕你所提议的内容的一个层次,但至少它被抽象为一个逻辑模块,而不是你的职责?

    (据我所知,要做到这一点,没有一个干净的方法可以不借助于思考/黑客实例)

    推荐文章