4

clojure は初めてで、clojure を使用して Java オブジェクトと対話したいと考えています。私がよく理解していれば、defprotocolを使用してこの相互作用に到達できます。私が具体的にやろうとしていることは、次のとおりです。

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-上記のJavaクラスTestObjectのインスタンスにアクセスできるようにするclojureプロトコルを作成します

(ns mytestspackage)
(defprotocol Test
  (first-name [t])
  (last-name [t])
  (age [t]))

ここで私の質問は、プロトコルで定義されたメソッドを具体的に実装する場所と、この実装を使用してTestObjectインスタンスを clojure 側に渡し、名、姓などの値にアクセスする方法です...

どんな助けでも大歓迎です。前もって感謝します。

よろしく、ホレス

4

2 に答える 2

3

私がよく理解していれば、defprotocol を使用してこの対話に到達できます。

いいえ、あなたはそれを間違っています。プロトコルは、インターフェースがプレーンな Java で許可するものと同様のものを許可することを目的としています (ただし、より強力です)。プロトコルなしで 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 である場合は、そのような実際のプログラムを作成する必要はありません。

于 2013-03-01T17:27:20.770 に答える
1

Clojure を使用して Java オブジェクトと対話するだけで、それらに新しい機能を実装したくない場合は、プロトコルについて心配する必要はありません。Clojure は、Java メソッド呼び出しの直接アクセスと構文を提供します。

たとえば、Clojure の文字列は java.lang.String オブジェクトです。

user=> (type "Really a Java String")
;; java.lang.String

user=> (.toUpperCase "Really a java string")
;;=> "REALLY A JAVA STRING"

テスト オブジェクト クラスがクラスパス上にある場合、次のようにインスタンスを作成できます。

user=> (def a-test-object (mytestpackage/TestObject. "lastName" "firstName" 42))

そして、次のようなメソッドを呼び出します:

user=> (.getAge a-test-object)

詳細については、 http://clojure.org/java_interopを参照してください。

于 2013-03-01T17:39:03.140 に答える