Закрытие нескольких конструкторов с использованием 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)))
Другие вопросы по тегам