我正在尝试找到一种初学Java对象的Clojure-idiomatic方法。我有以下代码:
(let [url-connection
(let [url-conn (java.net.HttpURLConnection.)]
(doto url-conn
(.setDoInput true)
; more initialization on url-conn
)
url-conn)]
; use the url-connection
)
但似乎非常尴尬。
有什么更好的方法来创建HttpURLConnection
对象并在以后在代码中使用它之前对其进行初始化?
更新:(doto ...)
似乎可以派上用场:
(let [url-connection
(doto (java.net.HttpURLConnection.)
(.setDoInput true)
; more initialization
))]
; use the url-connection
)
根据doto
文档,它返回它正在“执行”的值。
答案 0 :(得分:4)
正如我的问题更新中所解释的,这是我提出的答案:
(let [url-connection
(doto (java.net.HttpURLConnection.)
(.setDoInput true)
; more initialization
))]
; use the url-connection
)
也许有人能想出更好的一个。
答案 1 :(得分:3)
假设没有构造函数接受所需的所有初始化参数,那么你所做的就是我所知道的唯一方法。
你能做的一件事就是将它全部包装在这样的函数中:
(defn init-url-conn [doInput ...other params..]
(let [url-conn (java.net.HttpURLConnection.)]
(doto url-conn
(.setDoInput true)
; more initialization on url-conn
)
url-conn))
并致电:
(let [url-connection
(let [url-conn (init-url-con true ...other params..)]
; use the url-connection
)
但是,这是每个对象特定的,只有在多次初始化该类的对象时才非常有用。
此外,您可以编写一个接受所有方法名称的宏,并使用params并执行此操作。但是,当被呼叫时,该呼叫不会比你的第一个例子短得多。
如果有人有更好的想法,我希望看到它,因为我前几天问自己一样......