2009-12-29 9 views
7

Sono stufo di encapsuling ogni chiamata di asType con try/catch blocco come:Come sovraccaricare alcune conversioni di tipo Groovy per evitare tentativi/catture di NumberFormatException?

def b = "" 
def c 
try { 
    c = b as Integer 
} 
catch (NumberFormatException) { 
    c = null 
} 
println c 

invece vorrei scrivere nel mio codice seguente:

def b = "" 
def c = b as Integer 

e se b non è ben formattato , quindi voglio assegnare null a c

Quindi, come posso sovraccaricare questo comportamento predefinito perOperatore?

È rischioso farlo per la mia intera applicazione Grails? O è la soluzione migliore per creare semplicemente un metodo personale (come asTypeSafe) e chiamarlo? Groovy/Grails ha alcune modifiche alla configurazione riguardanti la conversione del tipo Groovy?

EDIT (per le persone interessate nella risposta implementato) Sulla base della risposta accettata, ho aggiunto il seguente codice al mio file bootstrap.groovy e funziona perfettamente.

String.metaClass.asTypeSafe = {Class c -> 
    try { 
     delegate.asType(c) 
    } 
    catch (Exception) { 
     return null 
    } 
} 

ed io lo chiamo come di seguito:

def myNum = myStr.asTypeSafe(Integer) 

risposta

9

È possibile ignorare il comportamento predefinito, fornendo una nuova implementazione asType. Assicurati di salvare quello vecchio e chiamalo per altre classi che non vuoi gestire da solo. Esempio:

oldAsType = String.metaClass.getMetaMethod("asType", [Class] as Class[]) 
String.metaClass.asType = { Class c -> 
    if (c == Integer) { 
     delegate.isInteger() ? delegate.toInteger() : null 
    } else { 
     oldAsType.invoke(delegate, c) 
    } 
} 

Per quanto riguarda se questa è una buona idea, bisogna ricordare che un sacco di oggetti sarà essere utilizzando le stringhe ed è abbastanza possibile che chiamano questa conversione e si basano su l'eccezione essere gettato. Stai scherzando con cose a un livello piuttosto basso.

Grails oggetti di dominio faranno un sacco di sollevamento di carichi pesanti di conversione di tipo se si passa in un oggetto params da un controller, ma io non penso che abbia qualsiasi tipo di modifiche a livello mondiale per questo genere di cose.

+0

Thx! Questo è esattamente ciò di cui avevo bisogno. Potrei davvero aggiungere un nuovo metodo alla classe String (come "asTypeSafe") invece di sovrascrivere asType per il tuo suggerimento. Inoltre, dove scrivi e chiami questo tipo di codice in un'applicazione Grails? In bootstap? – fabien7474

+1

Sì, il bootstrap sarebbe il posto giusto. – ataylor

Problemi correlati