Закрытие нескольких конструкторов с использованием gen-класса
Как я могу определить несколько конструкторов и состояний, используя gen-класс в clojure? Я не вижу способа сделать это с однозначными сопоставлениями для:init,:state и:constructors.
1 ответ
Несколько Конструкторов
Чтобы иметь несколько конструкторов в сгенерированном классе, вам нужны все параметры конструктора, указанные в параметре:constructors в gen-class, а функция: 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.
Несколько состояний
State - это, как правило, хэш-карта, поэтому вам не нужно несколько состояний. Просто используйте ключевые слова, где вы будете использовать имена полей в объекте.
{:name "name1"
:special false}
(defn -method1 [this] (:name (.state this)))