Clojure-idiomatic初始化Java对象的方法

时间:2010-11-30 14:23:23

标签: java clojure initialization idiomatic

我正在尝试找到一种初学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文档,它返回它正在“执行”的值。

2 个答案:

答案 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并执行此操作。但是,当被呼叫时,该呼叫不会比你的第一个例子短得多。

如果有人有更好的想法,我希望看到它,因为我前几天问自己一样......