2010-11-30 16 views
6

Estoy tratando de encontrar una forma idiomática de Clojure para inicializar un objeto Java. Tengo el siguiente código:Clojure-idiomatic forma de inicializar un objeto 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 
) 

pero parece muy incómoda.

¿Cuál es una mejor forma de crear el objeto HttpURLConnection e inicializarlo antes de usarlo más adelante en el código?

ACTUALIZACIÓN: Parece que (doto ...) puede ser útil aquí:

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

De acuerdo con los documentos doto, devuelve el valor al que está "haciendo".

Respuesta

4

Como se explica en la actualización a mi pregunta, aquí está la respuesta que se le ocurrió:

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

Tal vez alguien pueda encontrar una mejor.

+0

¿Qué más quiere más? El código es lo mínimo que puedes obtener. – kotarak

+0

@kotarak: Perfección :-). – Ralph

+1

:) Algunos dicen "Clojure". ;) – kotarak

3

Suponiendo que no hay un constructor que acepte todos los parámetros de inicialización necesarios, entonces la forma en que lo hizo es la única que conozco.

La única cosa que podría hacer es envolver todo en una función como esta:

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

y llame a:

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

Sin embargo, esto es específico por objeto y es realmente útil solo si está inicializando el objeto de esa clase más de una vez.

También podría escribir una macro que acepte todos los nombres de métodos y params y lo haga. Pero, cuando se le llame, esa llamada no sería mucho más corta que su primer ejemplo.

Si alguien tiene una idea mejor, me gustaría verlo, ya que me preguntaba lo mismo el otro día ..

+0

@Goric: Mira mi actualización. Puede ser la respuesta. – Ralph

+1

Sí. Y el documento para 'doto' tiene un ejemplo similar:' (doto (new java.util.HashMap) (.put "a" 1) (.put "b" 2)) ' –

+0

¡Gracias! Su actualización de hecho es la respuesta –

Cuestiones relacionadas