2009-12-29 3 views
7

Ich bin krank von encapsuling jeden Anruf von asType mit try/catch Block wie:Wie kann man einige Groovy Type Conversions überladen, um try/catch von NumberFormatException zu vermeiden?

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

stattdessen würde Ich mag in meinem Code folgendes schreiben:

def b = "" 
def c = b as Integer 

und wenn b ist nicht gut formatiert , dann möchte ich nullc zugewiesen werden

Also wie kann ich dieses Standardverhalten für dieüberladenBetreiber?

Ist es riskant, wenn ich es für meine gesamte Grails-Anwendung mache? Oder ist die beste Lösung, um einfach eine eigene Methode zu erstellen (wie asTypeSafe) und nennen Sie es? Haben Groovy/Grails einige Konfigurationsoptimierungen bezüglich der Groovy Type Conversion?

EDIT (für Leute mit Interesse an der Umsetzung Antwort) auf der akzeptierte Antwort Basierend habe ich den folgenden Code in meiner bootstrap.groovy Datei hinzugefügt und es funktioniert perfekt.

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

und ich nenne es wie folgt:

def myNum = myStr.asTypeSafe(Integer) 

Antwort

9

Sie können das Standardverhalten außer Kraft setzen, indem eine neue AsType Implementierung bietet. Stellen Sie sicher, dass Sie die alte speichern, und rufen Sie sie für andere Klassen auf, die Sie nicht selbst behandeln möchten. Beispiel:

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

Als ob das eine gute Idee, nur nicht vergessen, dass viele Objekte Strings werden verwenden und es ist durchaus möglich, sie nennen diese Umwandlung und stützen sich auf die Ausnahme ausgelöst wird. Sie machen mit Dingen auf ziemlich niedrigem Niveau herum.

Grails Domain-Objekte werden eine Menge der schweren Aufhebung der Typumwandlung tun, wenn Sie in einem Parameter-Objekt von einem Controller übergeben, aber ich glaube nicht, dass es irgendwelche globalen Verbesserungen für diese Art von Sache hat.

+0

Thx! Genau das habe ich gebraucht. Ich könnte tatsächlich eine neue Methode zur String-Klasse hinzufügen (wie "asTypeSafe"), anstatt asType nach Ihrem Vorschlag zu überschreiben. Wo schreiben Sie und nennen Sie diese Art von Code in einer Grails-Anwendung? In Bootstap? – fabien7474

+1

Ja, Bootstrap wäre der richtige Ort. – ataylor

Verwandte Themen