2010-11-30 25 views
6

我想找到一種Clojure慣用的方式來初始化一個Java對象。我有以下代碼:初始化Java對象的Clojure慣用的方式

(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對象並在之後在代碼中使用它之前對其進行初始化?

UPDATE:看來(doto ...)可以在這裏派上用場:

(let [url-connection 
     (doto (java.net.HttpURLConnection.) 
      (.setDoInput true) 
      ; more initialization 
     ))] 
    ; use the url-connection 
) 

按照doto文檔,它返回到它是「做」的值。

回答

4

正如更新我的問題解釋說,這裏是我的答案想出了:

(let [url-connection 
     (doto (java.net.HttpURLConnection.) 
      (.setDoInput true) 
      ; more initialization 
     ))] 
    ; use the url-connection 
) 

也許有人可以想出一個更好的。

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 
) 

然而,這是每個對象特定,它是真正有用的只有當你不止一次地初始化那個類的對象。

此外,你可以寫一個接受所有方法名稱和參數,並做到這一點。但是,當被調用時,該呼叫不會比第一個示例短得多。

如果任何人有一個更好的主意,我想看看它,因爲我是問自己同樣的只是一天..

+0

@Goric:查看我的更新。這可能是答案。 – Ralph 2010-11-30 14:41:46

+1

是的。和`doto`的doc有一個類似的例子:`(doto(new java.util.HashMap)(.put「a」1)(.put「b」2))` – 2010-11-30 14:44:45