How to verify if an object has certain property?

Groovy

Groovy Problem Overview


I want to use either a value of expected property or a specified default. How to achieve this in groovy?

Let's look at the example:

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

Groovy Solutions


Solution 1 - Groovy

You can use hasProperty. Example:

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

If you're using a variable for the property name, you can use this:

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

Solution 2 - Groovy

Assuming your object is a Groovy class, you can use hasProperty in the object metaClass like so:

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

So, then given two classes:

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

class Unnamed {
  int age

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

You can create instance of them, and test:

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

printName( a )
printName( b )

Which should output:

Printing Name : tim
toString Unnamed:32

Solution 3 - Groovy

You can write your own method via meta-programming:

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")

Solution 4 - Groovy

If I simply want to assert that an object has some property, I just test the following:

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

If myObject does not have myProperty the assertion will fail with a null pointer exception:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRomanView Question on Stackoverflow
Solution 1 - GroovyataylorView Answer on Stackoverflow
Solution 2 - Groovytim_yatesView Answer on Stackoverflow
Solution 3 - GroovyMichael EasterView Answer on Stackoverflow
Solution 4 - GroovyJim DaehnView Answer on Stackoverflow