0

gen-class を使用して、Clojure コードから Java クラスを生成しています。gen-class を機能させるには、クラスに追加されるすべてのメソッドに最初のパラメーターを追加する必要があります (ここでは と呼びますthis)。

(ns com.stackoverflow.clojure.testGenClass
  (:gen-class
     :name com.stackoverflow.clojure.TestGenClass
     :implements [com.stackoverflow.clojure.TestGenClassInterface]
     :prefix "java-"))

(def ^:private pre "START: ")

(defn java-addToString [this text post]
  (str pre text post))

コンパイル後、Java コンテキストでメソッドを呼び出すと正常に動作します。

(def var (com.stackoverflow.clojure.TestGenClass.))
(.addToString var "Aus Clojure heraus (Methode 1)." " :ENDE")
(. var addToString "Aus Clojure heraus (Methode 2)." " :ENDE")

しかし、Clojure から直接起動するにはどうすればよいでしょうか?

最初のパラメーターが欠落しているため、次のことは機能しません。

(java-addToString "TexT" " :END")

空の最初のパラメーターで関数を呼び出すのは良い習慣ですか?

(java-addToString "" "TexT" " :END")

または、addToString内部で使用する関数 (例: ) を追加し、メソッドとしてクラス ファイルに追加される関数からこの関数を呼び出す必要がありますか?

4

1 に答える 1

0

同じコードを、生成されたクラスのメソッドとして、およびそのクラスとは別の関数として扱いたいと思うのは、私には少し臭いようです (コードの臭いという意味では、設計のどこかに問題があることを示しています)。

おそらくaddToString静的メソッドである必要がありますか?

おそらくadd-to-string、clojure で直接使用でき、addToStringメソッドによっても呼び出される関数を作成する必要がありますか?

最良の答えを知る前に、あなたのより大きなデザインについてもっと知る必要がありますが、それはそれらの1つであると思います.

于 2014-10-19T00:19:04.577 に答える