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

したがって、次の 2 つのクラスが与えられます。

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 に答える