2010-11-30 43 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