当前位置:  开发笔记 > 前端 > 正文

如何重载一些Groovy Type转换以避免尝试/捕获NumberFormatException?

如何解决《如何重载一些GroovyType转换以避免尝试/捕获NumberFormatException?》经验,为你挑选了1个好方法。

我厌倦了asTypetry/catchblock 封装每个调用:

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

相反,我想在我的代码中写下以下内容:

def b = ""
def c = b as Integer

如果b格式不正确,那么我想null分配给c

那么如何为asType运营商重载此默认行为?

如果我为整个Grails应用程序执行此操作会有风险吗?或者是简单地创建我自己的方法(比如asTypeSafe)并调用它的最佳解决方案?Groovy/Grails有关于Groovy类型转换的一些配置调整吗?

编辑(对于对已实现的答案感兴趣的人)根据接受的答案,我将以下代码添加到我的bootstrap.groovy文件中,它完美地运行.

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

我将其称为如下:

def myNum = myStr.asTypeSafe(Integer)

ataylor.. 10

您可以通过提供新的asType实现来覆盖默认行为.确保保存旧的,并将其调用为您不想自己处理的其他类.例:

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

至于这是否是一个好主意,只需记住很多对象将使用字符串,他们很可能会调用此转换并依赖于抛出的异常.你在很低的水平搞乱了.

如果从控制器传入一个params对象,Grails域对象将会进行大量的类型转换,但我认为它不会对这种事情进行任何类型的全局调整.



1> ataylor..:

您可以通过提供新的asType实现来覆盖默认行为.确保保存旧的,并将其调用为您不想自己处理的其他类.例:

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

至于这是否是一个好主意,只需记住很多对象将使用字符串,他们很可能会调用此转换并依赖于抛出的异常.你在很低的水平搞乱了.

如果从控制器传入一个params对象,Grails域对象将会进行大量的类型转换,但我认为它不会对这种事情进行任何类型的全局调整.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有