Я сыт encapsuling по горло каждый вызов 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?
РЕДАКТИРОВАНИЕ (для людей, заинтересованных реализованным ответом) На основе принятого ответа, я добавил следующий код к своему 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)
}
}
Что касается того, является ли это хорошей идеей, просто помните, что многие объекты будут использовать Strings, и вполне возможно, что они вызовут это преобразование и будут полагаться на брошенное исключение. Вы шутите на довольно низком уровне.
Объекты домена Grails сделают большой подъём в преобразовании типов, если вы передадите объект params с контроллера, но я не думаю, что у него есть какие-то глобальные подстройки для такого рода вещей.
.Для тех из вас, кто использует Грааль 1.2, теперь есть эта опция при работе с параметрами, и я полагаю, что все GrailsParameterMaps.
def someInt = params.int("myInt")