13

在 Clojure 中创建 Java 类有几种不同的方法,那么在 Clojure 中选择 、 和 时有gen-class哪些proxy权衡reify?(还有其他方法可以创建我没有列出的 Java 类吗?)

我的基本理解是,我按功率降序列出了这些结构。

4

2 回答 2

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尽可能地使用。仅使用proxywhenreify的约束过于严格。

于 2011-04-29T13:38:25.980 回答
12

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

于 2011-04-29T19:33:02.280 回答