【问题标题】:Creating a library of Protocols and defrecords for use from Java创建用于 Java 的协议和 defrecords 库
【发布时间】:2015-11-24 16:28:19
【问题描述】:

目前,我有一个从 Java 调用的功能齐全的 Clojure 库。

我这样做的方式:我有一个文件,它使用 gen-class 将整个 API 包装为单个类的静态方法,并以 IPersistentVector 和 IPersistentMap 的形式传入和传出数据。

不过,现在我正在重构库并将功能置于各种协议后面。

我有四个协议,我们称它们为 A、B、C 和 D。还有两个定义记录 X 和 Y。X 和 Y 都实现了协议 A、B 和 C。而 Y 也实现了 D。

我需要做什么才能使这些对 Java 可用?这些是否可以作为接口和类自动使用?还是我仍然需要做相当于 gen-class 的操作才能将它们公开?

如果不是,那么 gen-class :methods 子句的等价物是什么,我在其中为方法的参数定义 Java 类型?

有没有人有一个简单的例子让 Java 可以使用协议和记录?

【问题讨论】:

    标签: clojure clojure-java-interop clojure-protocol


    【解决方案1】:

    defprotocol

    每个 Clojure 协议也是一个具有相同名称和方法的 Java 接口。如果我以ibm developerworks 为例,我们会看到:

    (ns com.amalgamated)
    
    (defprotocol Fulfillment
      (invoice [this] "Returns an invoice")
      (manifest [this] "Returns a shipping manifest"))
    

    相当于:

    package com.amalgamated;
    
    public interface Fulfillment {
        public Object invoice();
        public Object manifest();
    }
    

    Clojure.org 对此也有一些(相当简洁的)信息。

    希望参与协议的 Java 客户端可以这样做 通过实现协议生成的接口来有效地实现。外部的 协议的实现(当你想要一个 class 或 type 不在您的控制范围内参与协议)可以 使用扩展构造提供:

    (extend AType   AProtocol   
     {:foo an-existing-fn
        :bar (fn [a b] ...)
        :baz (fn ([a]...) ([a b] ...)...)}   BProtocol
        {...} ...)
    

    definterface

    如果你的目标是性能,你可以考虑使用definterface,它的使用类似于协议。这个SO post也有详细的使用方法:

    (definterface Foo
      [^int foo [x ^String y]]
      [^void bar [^ints is]])
    

    definterface 似乎是 faster 而不是协议。

    defrecord

    同样,records(以及deftypedefinterface)将生成Java 类。 同样,Clojure.org/datatypes 有有用的信息(强调我的):

    deftype 和 defrecord 动态生成编译后的字节码 具有一组给定字段的命名类,以及可选的方法 一个或多个协议和/或接口。它们适用于动态 和交互式开发,无需 AOT 编译,可以 在单个会话过程中重新评估。它们类似于 defstruct 生成具有命名字段的数据结构,但不同 来自defstruct:[...]

    所以是的,如果可以从 Java 获得。 请注意命名。

    作为旁注,您可能想看看calling Clojure from Java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多