在Clojure中创建Java类的选项

pau*_*doo 13 clojure clojure-java-interop

有几种不同的方法来创建Clojure中的Java类,所以什么都捡之间时,权衡gen-class,proxyreifyClojure中?(还有其他方法来创建我没有列出的Java类吗?)

我的基本理解是我已经按照权力的递减顺序列出了这些结构.

dby*_*rne 18

gen-class在需要命名类时使用,或者要为要创建的对象添加新方法. gen-class依赖于AOT编译.

当你想要一个匿名的,一次性实现你使用的类型reifyproxy.他们不依赖于AOT编译.这是他们的不同之处:

  1. reify仅支持协议或接口,proxy还支持具体的超类.
  2. reify使用真正的类方法,proxy使用外部函数.
  3. 由于#2,reify使用直接方法查找,同时proxy使用地图进行方法查找.
  4. 由于#3,reify不支持动态交换方法,但proxy确实如此.

reify会表现得更好proxy,所以你应该reify尽可能使用.仅proxyreify限制过于严格时才使用.


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用于大多数日常使用.