Как проверить, имеет ли объект определенное свойство?
Я хочу использовать либо значение ожидаемого свойства, либо указанное значение по умолчанию.
Как достичь этого в groovy?
Посмотрим на пример:
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
}
}
Ответы
Ответ 1
Вы можете использовать hasProperty
. Пример:
if (object.hasProperty('name') && object.name) {
println object.name
} else {
println object
}
Если вы используете переменную для имени свойства, вы можете использовать это:
String propName = 'name'
if (object.hasProperty(propName) && object."$propName") {
...
}
Ответ 2
Предполагая, что ваш object
является классом Groovy, вы можете использовать hasProperty
в объекте metaClass
так:
def printName( o ) {
if( o.metaClass.hasProperty( o, 'name' ) && o.name ) {
println "Printing Name : $o.name"
}
else {
println o
}
}
Итак, задайте два класса:
class Named {
String name
int age
String toString() { "toString Named:$name/$age" }
}
class Unnamed {
int age
String toString() { "toString Unnamed:$age" }
}
Вы можете создать экземпляр из них и протестировать:
def a = new Named( name: 'tim', age: 21 )
def b = new Unnamed( age: 32 )
printName( a )
printName( b )
Что должно выводиться:
Printing Name : tim
toString Unnamed:32
Ответ 3
Вы можете написать свой собственный метод с помощью мета-программирования:
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")
Ответ 4
Если я просто хочу утверждать, что объект имеет какое-то свойство, я просто проверяю следующее:
assertNotNull(myObject.hasProperty('myProperty').name)
Если myObject
не имеет myProperty
, утверждение завершится ошибкой с исключительным исключением:
java.lang.NullPointerException: Cannot get property 'name' on null object