2012-05-22 16 views
5

Così Groovy ha questa sintassi relativamente maneggevole per convertire i metodi in chiusure, ad es.Come si converte un costruttore di classe Groovy in una chiusura?

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

// is equivalent to 

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

Ma come faccio a convertire un costruttore della classe, per esempio

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

// is equivalent to 

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

riflessione di Groovy ha Thing.constructors Lista di ispezionare, ma non riesco a capire dove mettere la e commerciale in Thing.constructors[0].

+0

Questa è una buona domanda. Immagino che non sia possibile, poiché Groovy eredita la distinzione di Java tra metodi e costruttori (cioè i costruttori non sono solo metodi di classe); ma chi lo sa? :) – epidemian

risposta

6

È possibile utilizzare invokeConstructor metaClass method che richiama un costruttore per gli argomenti specificati.

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

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

Fantastico, funziona. Avrei preferito qualcosa di più conciso come "Thing. & New", ma questo è Java per te. Sai se ci sono vantaggi o svantaggi in termini di prestazioni rispetto a '{new Thing (it)}'? – blendmaster

+0

Scusa, non lo so –

Problemi correlati