49

我想使用预期属性的值或指定的默认值。如何在 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
   }
}
4

4 回答 4

93

您可以使用hasProperty. 例子:

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

如果您使用变量作为属性名称,则可以使用:

String propName = 'name'
if (object.hasProperty(propName) && object."$propName") {
    ...
}
于 2012-10-17T15:23:32.767 回答
6

假设你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
于 2012-10-17T15:23:02.863 回答
2

您可以通过元编程编写自己的方法:

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")
于 2017-12-11T13:00:03.773 回答
-5

如果我只是想断言一个对象具有某些属性,我只需测试以下内容:

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

如果myObject没有myProperty断言将失败并出现空指针异常:

java.lang.NullPointerException: Cannot get property 'name' on null object
于 2016-05-20T16:52:22.447 回答