2012-10-17 15 views
29

Bir beklenen özellik değeri veya belirtilen bir varsayılan değeri kullanmak istiyorum. Bunu nasıl başarırsınız? örneğeBir nesnenin belirli bir özelliği varsa nasıl onaylanır?

inceleyelim:

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

cevap

57

Sen hasProperty kullanabilirsiniz. Örnek:

özellik adı için bir değişken kullanıyorsanız
if (object.hasProperty('name') && object.name) { 
    println object.name 
} else { 
    println object 
} 

, bu kullanabilirsiniz: Sadece bir nesne bazı özelliğe sahip olduğunu iddia etmek isterseniz ben sadece test

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

+1 Benimkinden daha iyi ... metaClass ;-) –

+4

'# hasProperty''den başlamamış olmam gerekir [aslında bir MetaProperty] döndürür (http://groovy.codehaus.org/api/groovy/lang/MetaProperty .html), böylece 'object.hasProperty (propName) ?. getProperty (object)?: defval' –

+1

... gibi bir şeyler yapabilir ve groovyDoc (groovy-2.4.7) 'de bazı tutarsızlıklar olabilir: _Description_ ile başlayan metaclass, true isimlendirme isminin yerine getirildi. '' _Returns_, '' 'Bulunan MetaProperty ya da mevcut değilse null '' dır, gerçektir –

6

varsayarsak senin object bir Groovy sınıf, bunu böyle nesne metaClass içinde hasProperty kullanabilirsiniz geçerli:

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

Yani, daha sonra verilen iki sınıfları:

Örnek o oluşturabilirsiniz. Bunlardan, ve test f:

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

printName(a) 
printName(b) 

gerektiği çıkışı:

Printing Name : tim 
toString Unnamed:32 
+1

Teşekkür Tim, neden değil (yani sıradan bir şekilde metaclass gelen sınıf özelliğine erişmek için var. object.hasProperty ('name'))? –

-2

aşağıdaki:

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

myObject Eğer myProperty yok iddiası boş işaretçi haricinde başarısız olur:

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

Meta-programlama yoluyla kendi yöntemini yazabilirsiniz:

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") 
İlgili konular