【问题标题】:What is dispatching in JAVA?什么是 JAVA 中的调度?
【发布时间】:2011-04-01 01:20:53
【问题描述】:

我对调度到底是什么感到困惑。特别是在双重调度方面。有没有一种简单的方法可以让我掌握这个概念?

【问题讨论】:

  • 哈哈是的......我想如果我理解调度,我会更好地理解访问者模式
  • 啊,是的。对不起,我会删除标签。这与设计模式无关:)
  • 请注意,“调度”一词有些过载。它也可能意味着将计划任务放到处理器上的操作。在一些实时调度器中,调度器和调度器的概念是不同的思想和软件组件。

标签: java


【解决方案1】:

Dispatch 是一种语言将调用链接到函数/方法定义的方式。

在 java 中,一个类可能有多个名称相同但参数类型不同的方法,并且该语言指定方法调用被分派到具有正确数量的参数的方法,该方法具有实际参数所能提供的最具体的类型匹配。那是静态调度。

例如,

void foo(String s) { ... }
void foo(Object o) { ... }
{ foo("");           }  // statically dispatched to foo(String)
{ foo(new Object()); }  // statically dispatched to foo(Object)
{ foo((Object) "");  }  // statically dispatched to foo(Object)

Java 也有虚方法分派。子类可以覆盖在超类中声明的方法。所以在运行时,JVM 必须将方法调用分派到适合this 的运行时类型的方法版本。

例如,

class Base { void foo() { ... } }
class Derived extends Base { @Override void foo() { ... } }


{ new Derived().foo(); }  // Dynamically dispatched to Derived.foo.
{
  Base x = new Base();
  x.foo();                // Dynamically dispatched to Base.foo.
  x = new Derived();      // x's static type is still Base.
  x.foo();                // Dynamically dispatched to Derived.foo.
}

Double-dispatchstaticrun-time(也称为 dynamic)调度的组合。

【讨论】:

  • 这是一个非常漂亮的答案。我知道 Java 不是双分派语言,但您能否添加一个示例,说明在您当前示例的上下文中双分派会是什么样子?我猜它会类似于x.foo(""),但我认为看到它会很有帮助。
  • @Ogen,这是关于 Java 中的双重分派。你是指 JavaScript 吗?
  • @MikeSamuel 是的,我知道这是关于 Java 中的双重调度。而且我知道 Java 实际上并没有进行双重分派,但它仍然有助于我理解在您给出的示例的上下文中查看双重分派在 Java 中的样子。
  • @Ogen, Groovy 是一种 JVM 语言,IIRC 执行 proper multiple dispatch,任何尝试在 Java 中添加相同的语言(可能基于 invokedynamic)都会引擎盖下可能看起来很相似。我希望这能回答你的问题。
  • @MikeSamuel 感谢它很好地回答了它的链接。
猜你喜欢
  • 2010-09-19
  • 2014-09-16
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多