[英]How does JVM Clojure's implementation of Protcols work?
有关Clojure 协议的文档指出,为每个协议都生成了相应的Java接口。 但是,您可以使用协议进行的操作(将它们扩展为任意类型等)在Java接口方面似乎并不能直接实现。 协议和协议方法在内部如何工作? 为什么以及每个协议都需要Java接口?
对Clojure平台源代码的简要检查显示:
Class
映射到实现Class
的协议的Clojure函数。 (它实际上是一个名为MethodImplCache
的自定义类的实例。) Class
一个参数的Class
并在哈希表中进行查找。 Class
插入哈希表中,以便下次可以直接找到它。 Class
及其对应的方法实现都将缓存在一个实例变量中,如果下次分配的Class
相同,则用于绕过哈希查找。 MethodImplCache
可以解决对协议方法的调用。 reify
得到延伸的协议,或者如果您使用匿名类的实例deftype
或defrecord
进行延伸的协议的新类。 在任何一种情况下,您都将获得实现所生成接口的Class
对象。 所有这些似乎都暗示着,当扩展到任意类时,协议方法调用应该比普通的Clojure函数调用慢。 如果您defrecord
联方式扩展协议,则与reify
/ deftype
/ defrecord
一起使用时的性能应该要好得多,而不是单独调用extend-protocol
或extend-type
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.