2009-09-03 7 views
4

Existe-t-il un moyen de lier les propriétés d'une instance d'une classe aux propriétés d'une instance d'une autre classe (les champs communs entre les deux). Voir l'exemple ci-dessous:Groovy - lie les propriétés d'un objet à un autre

class One { 
    String foo 
    String bar 
} 

class Two { 
    String foo 
    String bar 
    String baz 
} 

def one = new One(foo:'one-foo', bar:'one-bar') 
def two = new Two() 

two.properties = one.properties 

assert "one-foo" == two.foo 
assert "one-bar" == two.bar 
assert !two.baz 

Le résultat est une erreur: Impossible de définir la propriété readonly: propriétés pour la classe: Deux

Répondre

7

Le problème est que pour chaque objet, .properties comprend deux haut-Groovy défini propriétés, ce sont les metaClass et class. Ce que vous voulez faire est de seulement définir les propriétés définies par l'utilisateur. Vous pouvez facilement le faire en utilisant le code tel que celui indiqué ci-dessous:

class One { 
    String foo 
    String bar 
} 

class Two { 
    String foo 
    String bar 
    String baz 
} 

def one = new One(foo:'one-foo', bar:'one-bar') 

// You'll probably want to define a helper method that does the following 3 lines for any Groovy object 
def propsMap = one.properties 
propsMap.remove('metaClass') 
propsMap.remove('class') 

def two = new Two(propsMap) 

assert "one-foo" == two.foo 
assert "one-bar" == two.bar 
assert !two.baz 
+0

Je suis curieux de connaître l'approche générale. J'ai une application web se connectant à un datawarehouse. Le domaine de l'application Web est assez différent des tables et des données provenant de l'entrepôt. J'ai l'intention d'utiliser probablement la technique ci-dessus dans la couche de service, mais recommanderiez-vous d'avoir une couche supplémentaire responsable de la transformation des objets hérités en objets de domaine? – ontk

+0

Cela ne fonctionne pas dans l'autre sens puisque la propriété baz n'est pas définie sur Un – dbrin

7

Je choisirais InvokerHelper.setProperties que je suggesed here.

use(InvokerHelper) { 
    two.setProperties(one.properties) 
} 
+0

Est-ce que cela gère les propriétés 'metaClass' et' class' en toute sécurité? Je veux dire, ne pas les écraser? – Nikem

Questions connexes