2012-05-22 19 views
5

So Groovy tiene esta sintaxis relativamente útil para convertir métodos en cierres, p.¿Cómo convierto un constructor de clase Groovy en un Cierre?

[1,2,3].each { println it } 

// is equivalent to 

[1,2,3].each this.&println 

Pero ¿Cómo se convierte un constructor de la clase, por ejemplo

[1,2,3].collect { new Thing(it) } 

// is equivalent to 

[1,2,3].collect ???? 

reflexión del maravilloso tiene Thing.constructors Lista de inspeccionar, pero no puedo averiguar dónde poner el signo en Thing.constructors[0].

+0

Esta es una buena pregunta. Me imagino que no es posible, ya que Groovy hereda la distinción de Java entre métodos y constructores (es decir, los constructores no son solo métodos de clase); ¿pero quién sabe? :) – epidemian

Respuesta

6

Puede usar invokeConstructor metaClass method que invoca un constructor para los argumentos dados.

class Thing { 
    Thing(Integer num) { this.num = num } 
    Integer num 
} 

[1,2,3].collect Thing.metaClass.&invokeConstructor 
+0

Impresionante, funciona. Hubiera preferido algo más conciso como 'Thing. & New' pero eso es Java para ti. ¿Sabes si hay beneficios de rendimiento o inconvenientes de esto en '{new Thing (it)}'? – blendmaster

+0

Lo siento, no sé eso –

Cuestiones relacionadas