Написание собственной функции-конструктора, вероятно, лучший путь.Как сказал Артур Ульфельдт, у вас есть функция, которую вы можете использовать в качестве функции (например, с apply
) вместо вызова конструктора взаимодействия с Java.
С вашей собственной функцией конструктора вы также можете выполнить проверку аргумента илипредоставить аргументы по умолчанию.Вы получаете другой уровень абстракции для работы;вы можете определить make-user
, чтобы возвращать хеш-карту для быстрой разработки, и если позже вы решите перейти на записи, вы можете сделать это, не нарушая ничего.Вы можете писать конструкторы с несколькими арностями, или принимать аргументы с ключевыми словами, или делать множество других вещей.
(defn- default-user [name]
(str (.toLowerCase name) "@example.com"))
(defn make-user
([name] (make-user name nil nil))
([name place] (make-user name nil place))
([name user place]
(when-not name
(throw (Exception. "Required argument `name` missing/empty.")))
(let [user (or user (default-user name))]
(User. name user place))))
(defn make-user-keyword-args [& {:keys [name user place]}]
(make-user name user place))
(defn make-user-from-hashmap [args]
(apply make-user (map args [:name :user :place])))
user> (apply make-user ["John" "john@example.com" "Somewhere"])
#:user.User{:name "John", :email "john@example.com", :place "Somewhere"}
user> (make-user "John")
#:user.User{:name "John", :email "john@example.com", :place nil}
user> (make-user-keyword-args :place "Somewhere" :name "John")
#:user.User{:name "John", :email "john@example.com", :place "Somewhere"}
user> (make-user-from-hashmap {:user "foo"})
; Evaluation aborted.
; java.lang.Exception: Required argument `name` missing/empty.