开发者

How to overload some Groovy Type conversion for avoiding try/catch of NumberFormatException?

开发者 https://www.devze.com 2022-12-14 21:22 出处:网络
I am sick of encapsuling each call of asType with try/catch block like : def b = \"\" def c try { c = b as Integer

I am sick of encapsuling each call of asType with try/catch block like :

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

instead I would like to write in my code the following:

def b = ""
def c = b as Intege开发者_运维知识库r

and if b is not well-formatted, then I want to have null be assigned to c

So how can I overload this default behavior for the asType operator ?

Is it risky if I do it for my entire Grails application? Or is the best solution to simply create a method of my own (like asTypeSafe) and call it ? Do Groovy/Grails have some configuration tweaks regarding Groovy Type conversion?

EDIT (for people interested in the implemented answer) Based on the accepted answer, I have added the following code to my bootstrap.groovy file and it works perfectly.

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

and I call it as below:

def myNum = myStr.asTypeSafe(Integer)


You can override the default behavior by providing a new asType implementation. Make sure you save the old one, and call it for other classes you don't want to handle yourself. Example:

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

As for whether this is a good idea, just remember that a lot of objects will be be using Strings and it's quite possible they call this conversion and rely on the exception being thrown. You're messing with things at quite a low level.

Grails domain objects will do a lot of the heavy lifting of type conversion if you pass in a params object from a controller, but I don't think it has any kind of global tweaks for this kind of thing.


For those of you using Grails 1.2 we now have this option when dealing with params, and I believe all GrailsParameterMaps.

def someInt = params.int("myInt")

See: http://www.grails.org/1.2+Release+Notes#Convenient%2C%20null%20safe%20converters%20in%20params%20and%20tag%20attributes

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号