gpt4 book ai didi

grails - 如何重载一些 Groovy 类型转换以避免 NumberFormatException 的 try/catch?

转载 作者:行者123 更新时间:2023-12-01 23:00:00 25 4
gpt4 key购买 nike

我厌倦了用 try/catch block 封装 asType 的每个调用,如下所示:

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)

最佳答案

您可以通过提供新的 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)
}
}

至于这是否是一个好主意,请记住,许多对象将使用字符串,并且它们很可能调用此转换并依赖于抛出的异常。你在相当低的水平上搞乱了事情。

如果您从 Controller 传入 params 对象,Grails 域对象将完成大量类型转换的繁重工作,但我认为它没有针对此类事情进行任何类型的全局调整。

关于grails - 如何重载一些 Groovy 类型转换以避免 NumberFormatException 的 try/catch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1975934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com