【问题标题】:How to overload some Groovy Type conversion for avoiding try/catch of NumberFormatException?如何重载一些 Groovy 类型转换以避免尝试/捕获 NumberFormatException?
【发布时间】:2009-12-29 17:55:52
【问题描述】:

我厌倦了将asType 的每个调用都封装在try/catch 块中,例如:

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 类型转换的配置调整?

EDIT(适用于对实施答案感兴趣的人) 根据接受的答案,我已将以下代码添加到我的 bootstrap.groovy 文件中,它运行良好。

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

我这样称呼它:

def myNum = myStr.asTypeSafe(Integer)

【问题讨论】:

    标签: grails groovy type-conversion


    【解决方案1】:

    您可以通过提供新的 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 域对象将完成大量类型转换的繁重工作,但我认为它没有针对此类事情进行任何类型的全局调整。

    【讨论】:

    • 谢谢!这正是我所需要的。我可能确实会向 String 类添加一个新方法(如“asTypeSafe”),而不是根据您的建议覆盖 asType。另外,您在 Grails 应用程序中的何处编写和调用此类代码?在引导程序中?
    【解决方案2】:

    对于那些使用 Grails 1.2 的人来说,我们现在在处理参数时有了这个选项,我相信所有的 GrailsParameterMaps。

    def someInt = params.int("myInt")
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2014-11-26
      相关资源
      最近更新 更多