proxy和reify有什么区别?

num*_*_cn 15 clojure

proxy和reify有什么区别?我有一些示例代码:

(.listFiles (java.io.File. ".")
  (proxy
    [java.io.FileFilter] []
    (accept [f]
      (.isDirectory f))))

(.listFiles (java.io.File. ".")
  (reify
    java.io.FileFilter
    (accept [this f]
      (.isDirectory f))))
Run Code Online (Sandbox Code Playgroud)

结果是一样的,当使用代理或reify时,有什么更好的?

更新:

我发现了一些东西

  • 代理不需要this作为第一个参数.
  • 代理支持超类.
  • 代理支持参数.

Vie*_*jes 20

来自Clojure.org的数据类型概述:

方法体reify是词法闭包,可以参考周围的局部范围.reify不同之处proxy在于:

  • 仅支持协议或接口,不支持具体的超类.
  • 方法体是结果类的真实方法,而不是外部fns.
  • 在实例上调用方法是直接的,而不是使用地图查找.
  • 不支持方法映射中的方法的动态交换.

结果是proxy在构造和调用方面都有更好的性能.在其约束条件不高的所有情况下reify都是优选的proxy.

资料来源:http://clojure.org/datatypes