如何验证对象是否具有某些属性?

Rom*_*man 37 groovy

我想使用期望属性的值或指定的默认值.如何在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
   }
}
Run Code Online (Sandbox Code Playgroud)

ata*_*lor 75

你可以用hasProperty.例:

if (object.hasProperty('name') && object.name) {
    println object.name
} else {
    println object
}
Run Code Online (Sandbox Code Playgroud)

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

String propName = 'name'
if (object.hasProperty(propName) && object."$propName") {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • `#hasProperty`的实际返回[元属性(http://groovy.codehaus.org/api/groovy/lang/MetaProperty.html),所以你也可以这样做`object.hasProperty(PROPNAME)?的getProperty(对象)?:defval` (4认同)

tim*_*tes 6

假设您object是一个Groovy类,您可以hasProperty在对象中使用,metaClass如下所示:

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

那么,给出两个类:

class Named {
  String name
  int age

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

class Unnamed {
  int age

  String toString() { "toString Unnamed:$age" }
}
Run Code Online (Sandbox Code Playgroud)

您可以创建它们的实例,并测试:

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

printName( a )
printName( b )
Run Code Online (Sandbox Code Playgroud)

哪个应该输出:

Printing Name : tim
toString Unnamed:32
Run Code Online (Sandbox Code Playgroud)