2009-12-29 3 views
7

Jestem chory kapsułkowania każde wezwanie asType z try/catch blok jak:Jak przeładować konwersję typu Groovy w celu uniknięcia próby/przechwycenia wyjątku NumberFormatException?

def b = "" 
def c 
try { 
    c = b as Integer 
} 
catch (NumberFormatException) { 
    c = null 
} 
println c 

zamiast chciałbym napisać w moim kodu, co następuje:

def b = "" 
def c = b as Integer 

a jeśli b nie jest dobrze sformatowany , następnie chcę mieć null przypisane do c

Jak mogę przeciążać to domyślne zachowanie dlaOperator?

Czy to ryzykowne, jeśli zrobię to dla całej aplikacji Grails? Czy jest to najlepsze rozwiązanie, aby po prostu utworzyć własną metodę (np. asTypeSafe) i nazwać ją? Czy Groovy/Grails ma kilka poprawek konfiguracyjnych dotyczących konwersji Groovy Type?

EDIT (dla osób zainteresowanych wdrożonego odpowiedź) podstawie zaakceptowanych odpowiedzi Dodałem następujący kod do mojego pliku bootstrap.groovy i działa idealnie.

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

i wzywam go jak poniżej:

def myNum = myStr.asTypeSafe(Integer) 

Odpowiedz

9

Możesz zmienić domyślne zachowanie, dostarczając nową implementację asType. Pamiętaj, aby zapisać stary i zadzwonić do innych klas, których nie chcesz obsługiwać. Przykład:

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) 
    } 
} 

Co do tego, czy jest to dobry pomysł, ale należy pamiętać, że wiele obiektów będzie można za pomocą łańcuchów i to całkiem możliwe, nazywają tę przemianę i polegać na wyjątek wyrzucane. Denerwujesz się rzeczami na dość niskim poziomie.

Obiekty domenowe Grailsa wykonają wiele operacji podnoszenia ciężarów w typie konwersji, jeśli przekażesz obiekt params ze sterownika, ale nie sądzę, że ma on jakiekolwiek globalne usprawnienia dla tego typu rzeczy.

+0

Thx! Dokładnie tego potrzebowałem. Naprawdę mogę dodać nową metodę do klasy String (np. "AsTypeSafe") zamiast przesłonić asType za Twoją sugestią. Ponadto, gdzie piszesz i nazywasz ten rodzaj kodu w aplikacji Grails? W bootstapie? – fabien7474

+1

Tak, bootstrap byłby właściwym miejscem. – ataylor