Как перегрузить некоторое Преобразование типов Groovy для предотвращения попытки/выгоды NumberFormatException?

Я сыт 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)
7
задан fabien7474 30 December 2009 в 19:57
поделиться

2 ответа

Вы можете переопределить поведение по умолчанию, предоставив новую реализацию типа 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 с контроллера, но я не думаю, что у него есть какие-то глобальные подстройки для такого рода вещей.

.
10
ответ дан 6 December 2019 в 21:14
поделиться

Для тех из вас, кто использует Грааль 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

2
ответ дан 6 December 2019 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: