clojure - 从 clojure 操作 java 对象

标签 clojure functional-programming clojurescript clojure-contrib

我是 clojure 的新手,想使用 clojure 与 java 对象进行交互。如果我很好理解,
可以使用 进行此交互默认协议(protocol) .
我具体尝试做的是以下内容:

1-我有以下java类

package mytestspackage;

public class TestObject {

    private String lastName;
    private String firstName;
    private String age;

    public TestObject(String lastName, String firstname, String age) {
        super();
        this.lastName = lastName;
        this.firstName = firstname;
        this.age = age;
    }

    public String getName() {
        return this.lastName;
    }

    public void setName(String name) {
        this.lastName = name;
    }

    public String getFirstname() {
        return this.firstName;
    }

    public void setFirstname(String vorname) {
        this.firstName = vorname;
    }

    public String getAge() {
        return this.age;
    }

    public void setAge(String age) {
        this.age = age;
    }

}

2-我创建了一个 clojure 协议(protocol),它应该允许我访问上述 java 类 TestObject 的实例
(ns mytestspackage)
(defprotocol Test
  (first-name [t])
  (last-name [t])
  (age [t]))

现在我的问题是:我在哪里具体实现协议(protocol)中定义的方法以及如何使用此实现将 TestObject 实例传递到 clojure 端并访问名字、姓氏等值...

任何帮助,将不胜感激。
提前致谢。

问候,贺拉斯

最佳答案

If I have well understood, one can reach this interaction using defprotocol.



不,你搞错了。协议(protocol)旨在允许类似于普通 java 中的接口(interface)允许的事情(尽管更强大)。您可以在没有任何协议(protocol)的情况下访问您的 Java 类。有关此主题的官方 clojure 文档:http://clojure.org/java_interop

例子:
(ns example
  (:import mytestpackage.TestObject))

;; This is how we call methods on java objects    

(defn first-name [obj]
  (.getFirstname obj))

(defn last-name [obj]
  (.getName obj))

(defn age [obj]
  (.getAge obj))

(defn set-first-name [obj name]
  (.setFirstname obj name))

(defn set-last-name [obj name]
  (.setName obj name))

(defn set-age [obj age]
  (.setAge obj age))

;; In REPL

example => (let [x (TestObject. nil nil nil)      ;; This is how we create Java objects
                 x (new TestObject nil nil nil)]  ;; These expressions are equivalent
              (println (first-name x))
              (set-first-name x "Name")
              (println (first-name x))
              (set-last-name x "Last name")
              (set-age x "23")
              (println (last-name x))
              (println (age x)))
;; Outputs
nil
Name
Last name
23

请注意,此代码只不过是旨在介绍 java 互操作的示例。绝不应该编写这样的真实程序,尤其是如果它们主要是在 Clojure 中。

关于clojure - 从 clojure 操作 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15162732/

相关文章:

clojure - 在 clojure 中跟踪先前值的惯用方法是什么?

functional-programming - 函数和数据有什么区别?

c++ - 如何反转它们的 std::vector<> 中每个谓词的意义?

clojurescript - 为什么clojurescript调用一些js函数时使用 "-"而另一些则不调用?

clojure - ClojureScript 不需要 Clojure 的 defstruct 背后的原因是什么?

clojure - 为什么每一个?函数在 Clojure 中用空向量返回 true?

clojure - 在clojure中对一系列 bool 值进行分组?

Emacs close paren 在编辑clojure 代码时跳转到已经存在的close-paren

recursion - 使用 recur 在 Clojure 中缓存 "recursive"调用的值

java - 使用流和 lambda 在 Java 8 中使用 if-else 条件