2012-10-17 20 views
29

Chcę użyć wartości oczekiwanej właściwości lub określonej wartości domyślnej. Jak to osiągnąć w doskonałej formie? wyglądJak sprawdzić, czy obiekt ma określoną właściwość?

Miejmy na przykład:

def printName(object) { 
    //if object has initialized property 'name' - print 'name', otherwise print ToString 
    if (object<some code here>name && object.name) { 
     print object.name 
    } else { 
     print object 
    } 
} 

Odpowiedz

57

Można użyć hasProperty. Przykład:

if (object.hasProperty('name') && object.name) { 
    println object.name 
} else { 
    println object 
} 

Jeśli używasz zmiennej dla nazwy właściwości, można użyć to:

String propName = 'name' 
if (object.hasProperty(propName) && object."$propName") { 
    ... 
} 
+0

+1 Lepsze niż moje ... Nie powinienem był zaczynać od metaClass ;-) –

+4

'' hasProperty' faktycznie zwraca [MetaProperty] (http://groovy.codehaus.org/api/groovy/lang/MetaProperty .html), więc możesz też zrobić coś takiego jak 'object.hasProperty (propName) ?. getProperty (object)?: defval' –

+1

... i jest pewne niespójności w groovyDoc (groovy-2.4.7): _Description_ zaczyna się od '' 'Zwraca true do implementacji MetaClass ma właściwość o podanej nazwie ' '' _Returns_ oznacza "Znalezioną MetaProperty lub null, jeśli nie istnieje" ", która jest prawdą. –

6

Zakładając, że object jest Groovy klasy, można użyć hasProperty w obiekcie metaClass tak:

def printName(o) { 
    if(o.metaClass.hasProperty(o, 'name') && o.name) { 
    println "Printing Name : $o.name" 
    } 
    else { 
    println o 
    } 
} 

Tak więc podane dwie klasy:

class Named { 
    String name 
    int age 

    String toString() { "toString Named:$name/$age" } 
} 

class Unnamed { 
    int age 

    String toString() { "toString Unnamed:$age" } 
} 

Można utworzyć instancję o f nich i badania:

def a = new Named(name: 'tim', age: 21) 
def b = new Unnamed(age: 32) 

printName(a) 
printName(b) 

który powinien wyjście:

Printing Name : tim 
toString Unnamed:32 
+1

Dzięki Tim, dlaczego mam dostępu do właściwości klasy z metaklasą a nie w zwykły sposób (tj. object.hasProperty ('name'))? –

-2

Gdybym po prostu chcą twierdzić, że obiekt ma pewną właściwość, po prostu przetestować następujące:

assertNotNull(myObject.hasProperty('myProperty').name) 

Jeśli myObject nie posiada myProperty twierdzenie nie powiedzie się z pustego wskaźnika wyjątek:

java.lang.NullPointerException: Cannot get property 'name' on null object 
1

Możesz napisać własną metodę poprzez meta-programowania:

class Foo { 
    def name = "Mozart" 
} 

def f = new Foo() 

Object.metaClass.getPropertyOrElse = { prop, defaultVal -> 
    delegate.hasProperty(prop) ? delegate."${prop}" : defaultVal 
} 

assert "Mozart" == f.getPropertyOrElse("name", "") 
assert "Salzburg" == f.getPropertyOrElse("city", "Salzburg") 
Powiązane problemy