Clojure使用gen-class的多个构造函数

时间:2013-09-13 06:55:04

标签: clojure gen-class

如何在clojure中使用gen-class定义多个构造函数和状态? 我没有看到使用单值映射执行此操作的方法:init,:state和:constructors。

1 个答案:

答案 0 :(得分:11)

多个构造函数

要在生成的类上拥有多个构造函数,您需要在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 hash-map中的空向量值指定。

多个州

状态通常是哈希映射,因此您不需要多个状态。只需使用在对象中使用字段名称的关键字。

{:name "name1"
 :special false}

(defn -method1 [this] (:name (.state this)))