我厌倦了asType
用try/catch
block 封装每个调用:
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域对象将会进行大量的类型转换,但我认为它不会对这种事情进行任何类型的全局调整.
您可以通过提供新的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域对象将会进行大量的类型转换,但我认为它不会对这种事情进行任何类型的全局调整.