proxy和reify有什么区别?

时间:2012-06-13 08:02:46

标签: 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))))

结果相同,当使用代理或reify时,哪个更好?

更新

我找到了一些东西:

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

1 个答案:

答案 0 :(得分:20)

来自Clojure.org's overview of data types

  

reify的方法体是词法闭包,可以引用周围的局部范围。 reifyproxy的不同之处在于:

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

结果在构造和调用方面都比proxy具有更好的性能。 reify优于proxy,但在所有情况下,其约束都不会过高。

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