Clojure-идиоматический способ инициализации объекта Java - PullRequest
6 голосов
/ 30 ноября 2010

Я пытаюсь найти Clojure-идиоматический способ инициализации объекта Java. У меня есть следующий код:

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

4 голосов
/ 01 декабря 2010

Как объяснено в обновлении к моему вопросу, вот ответ, который я придумал:

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

Может быть, кто-то может придумать лучший.

3 голосов
/ 30 ноября 2010

Предполагая, что нет конструктора, который принимает все необходимые параметры инициализации, тогда единственный способ, который я знаю, - это то, как вы это сделали.

Единственное, что вы можете сделать, это обернуть все в такую ​​функцию:

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

Однако это специфично для каждого объекта и действительно полезно, только если вы инициализируете объект этого класса более одного раза.

Также вы можете написать макрос, который принимает все имена методов и параметры и делает это. Но при вызове этот вызов не будет намного короче вашего первого примера.

Если у кого-то есть идея получше, я бы хотел ее увидеть, поскольку я спрашивал себя об этом только на днях ..

...