8

如何在 clojure 中使用 gen-class 定义多个构造函数和状态?我看不到使用 :init、:state 和 :constructors 的单值映射的方法。

4

1 回答 1

13

多个构造函数

要在生成的类上有多个构造函数,您需要在 gen-class 的 :constructors 选项中指定的所有构造函数参数,并且 :init 函数应该是多参数以匹配。类似于以下内容:

(ns something-amazing
  (:gen-class :init myconstructor
              :state state
              :constructors {[String] []
                             [String String] []}))

(defn -myconstructor
  ([^String p1] [[] {:name p1 :special false}])
  ([^String p1 ^String p2] [[] {:name p1 :special p2}]))

在这种情况下,两个构造函数都将调用相同的零参数超类型构造函数,由 :constructor 哈希映射中的空向量值指定。

多个状态

状态通常是一个哈希映射,所以你不需要多个状态。只需在对象中使用字段名称的地方使用关键字。

{:name "name1"
 :special false}

(defn -method1 [this] (:name (.state this)))
于 2013-09-13T08:00:52.737 回答