Domanda

Ho sviluppato una classe che ha alcuni metodi che aumentano Integer, permette soprattutto a fare questo:

def total = 100.dollars + 50.euros

Ora devo estendere Integer.metaClass fare qualcosa di simile:

Integer.metaClass.getDollars = {->
    Money.Dollar(delegate)
}

Ho provato a mettere che alla fine del file, prima della dichiarazione di classe di denaro, ma il compilatore dice che una classe denominata denaro esiste già, lo so perché succede (perché Groovy crea una classe con il nome del file con un vuoto statico vuoto principale per eseguire questo codice).

Ho anche provato ad utilizzare un blocco statico all'interno della classe come questa:

static {
    Integer.metaClass.getDollars = {->
        Money.Dollar(delegate)
    }
}

Questa né opere.

Una terza soluzione potrebbe essere quella di cambiare il nome del file (come MoneyClass.groovy) e mantenere il nome della classe (classe di denaro), ma che sembra un po 'strano.

C'è qualcos'altro che posso fare? Grazie.

È stato utile?

Soluzione

Basta mettere in qualsiasi metodo di qualsiasi classe forse un TypeEnhancer.groovy fagiolo:

public class TypeEnhancer {
  public void start() {
    Integer.metaClass.getDollars() = {-> Money.Dollar(delegate) }
  }

  public void stop() {
    Integer.metaClass = null
  }
}

Basta creare e inizializzare chiamando start (): new TypeEnhancer().start();. Per disabilitare la valorizzazione, chiamare new TypeEnhancer().stop();. Il fagiolo può anche usato come bean Spring.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top