【问题标题】:Slow calls to clojure proxy对 clojure 代理的缓慢调用
【发布时间】:2010-12-18 00:00:32
【问题描述】:

我在 clojure 中有一个应用程序,它大量使用称为 Vaadin 的 Java 框架。 Vaadin 使用 clojure 的 Java“代理”功能使用多个回调。但是,每次在 clojure 函数中调用代理时,都会有很大的延迟(有时是 100 毫秒)。有什么办法可以加快速度吗?

【问题讨论】:

  • 你尝试过输入类型提示吗?
  • 您的意思是为代理名称添加类型提示,还是为实现的方法添加方法参数?
  • 只需打开warn-on-reflection 并输入类型提示即可删除所有警告。
  • 我在 ns 声明后将“(set!warn-on-reflection true)”添加到了 clj 文件的开头,但出现错误“java.lang.Exception: Unable to resolve symbol:在这种情况下的反射警告 (filename.clj:18)"
  • 这应该是*warn-on-reflection*——注意星号。

标签: clojure


【解决方案1】:

我的理解是新的reify 宏比proxy 快。如果你只需要实现一个接口,你可以使用它。

例如,如果您需要实现java.awt.event.ActionListener,您可以使用如下代码:

(import 'java.awt.event.ActionListener 'javax.swing.JButton)
(let [a-button (JButton. "Click Me")]
  (.addActionListener a-button
    (reify ActionListener
      (actionPerformed [this ev] (comment do something interesting)))))

【讨论】:

  • 由于某种原因,reify 无法在 Vaadin 接口 com.vaadin.ui.Button$ClickListener 上运行。这是因为 com.vaadin.ui.Button$ClickListener 是静态接口吗?
  • @Zubair:不确定。在我让它工作之前,我不得不使用 reify 函数一段时间。我做的最后一件事是添加this 变量。你得到了什么错误?
  • 实际上可以在一个reify 表单中实现多个接口。与proxy 相比的限制是reify 不能扩展类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2018-10-24
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2023-03-21
  • 2010-09-27
相关资源
最近更新 更多