pau*_*doo 13 clojure clojure-java-interop
有几种不同的方法来创建Clojure中的Java类,所以什么都捡之间时,权衡gen-class,proxy和reifyClojure中?(还有其他方法来创建我没有列出的Java类吗?)
我的基本理解是我已经按照权力的递减顺序列出了这些结构.
dby*_*rne 18
gen-class在需要命名类时使用,或者要为要创建的对象添加新方法. gen-class依赖于AOT编译.
当你想要一个匿名的,一次性实现你使用的类型reify或proxy.他们不依赖于AOT编译.这是他们的不同之处:
reify仅支持协议或接口,proxy还支持具体的超类.reify使用真正的类方法,proxy使用外部函数.reify使用直接方法查找,同时proxy使用地图进行方法查找.reify不支持动态交换方法,但proxy确实如此.reify会表现得更好proxy,所以你应该reify尽可能使用.仅proxy在reify限制过于严格时才使用.
Rob*_*lan 10
除了gen-class,proxy和reify之外,我们还有defrecord和deftype.后两个选项应该是创建命名java类的第一选择(在defrecord的情况下,对于任何具有命名组件的结构的首选.)
clojure.org上的数据类型页面是该主题的一个很好的参考.Defrecord,deftype和reify比gen-class和proxy更新,已经在版本1.2中引入(我认为 - 可能是1.1).Defrecord和deftype都创建符合接口的类,但不允许继承.如果你需要继承,gen-class(和匿名类的代理)仍然是你唯一的选择.
Defrecord和deftype在免费赠送的内容上有所不同.Defrecord自动创建一个符合IPersistentMap和ISeq的类.另一方面,Deftype可以让您更好地控制您的类,甚至允许可变字段(在defrecord中不允许).通常,deftype用于数据结构的低级实现,而defrecord用于大多数日常使用.