2010-11-30 8 views
6

Javaオブジェクトを初期化するためのClojure-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オブジェクトを作成し、コードの後半で使用する前に初期化するより良い方法はありますか?

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 
) 

多分、誰かがより良いものを考え出すことができます。

+0

他に何がほしいですか?あなたが得ることができるコードは最小限です。 – kotarak

+0

@kotarak:パーフェクション:-)。 – Ralph

+1

:)「Clojure」と言う人もいます。 ;) – kotarak

3

必要なすべての初期化パラメータを受け入れるコンストラクタがないと仮定すると、私が知っているのはそれだけです。

あなたができる一つのことは、このような機能でそれをすべてをラップされています。しかし、これはオブジェクトごとに固有のものです

(let [url-connection 
     (let [url-conn (init-url-con true ...other params..)] 
    ; use the url-connection 
) 

、それは本当に便利です。

(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)) 

として呼び出しますそのクラスのオブジェクトを複数回初期化している場合に限ります。

また、すべてのメソッド名とparamsを受け入れ、これを行うマクロを書くことができます。しかし、呼び出されると、その呼び出しは最初の例よりもずっと短くはありません。

誰もがより良いアイデアを持っている場合、私はちょうど先日自分自身に同じことを求めていたことから、私は、それを見てみたいと思いますが...

+0

@Goric:私のアップデートをチェックしてください。それは答えかもしれない。 – Ralph

+1

はい。 'doto'のドキュメントにも同様の例があります。' 'doto(new java.util.HashMap)(.put" a "1)(.put" b "2))' –

+0

ありがとう!あなたのアップデートは確かに答えです –

関連する問題