2010-02-01 8 views
1

J'essaie de profiter du fait que groovy est plus dynamique que java. Je voudrais avoir un bloc de code qui nePuis-je appeler les méthodes "find" de GORM sur un objet au lieu de la classe?

TypeA type = //do something to build an object 
TypeA dbType = TypeA.findBySomethingAndSomething(something, somethingelse) 
if(dbType != null) 
    type.id = dbType.id 
type.save() 

mais qui peuvent travailler pour plusieurs objets qui prennent en charge la même méthode de findBySomethingAndSomething.

Est-il possible de dire

def type = //do something to build an object 
def dbType = type.findBySomethingAndSomething(type.identifier, type.otheridentifier) 
if(dbType != null) 
    type.id = dbType.id 
type.save() 

Y at-il une "meilleure" façon d'y arriver? J'essaie d'éviter une grande déclaration switch ou if/else qui fait essentiellement la même chose pour chaque type.

Répondre

2

Vous pouvez toujours obtenir l'objet de classe à partir d'une instance via instance.getClass(). Par conséquent, les éléments suivants devraient fonctionner:

instance.getClass().findBySomethingAndSomething(type.identifier, type.otheridentifier) 

aussi longtemps que la classe de l'instance prend en charge findBySomethingAndSomething

+2

Pensez à utiliser getClass() à la place. Cela ne fera pas beaucoup de différence dans ce cas - mais c'est une bonne habitude à prendre au cas où 'l'instance' est une carte. –

+0

Bon conseil John, ça m'a fait sortir plusieurs fois quand les tests passent une carte pour se moquer d'une instance - j'ai mis à jour ma réponse. –