2010-02-23 3 views
1
class Foo(){ 
    private String x,y; 
    //getters setters 
} 
main(){ 
    Foo bar1 = new Foo(); 
    Foo bar2 = new Foo(); 
    bar1.setX("hey"); 
    bar2.setX("hi"); 
    bar2.setY(" there"); 
    setNewValuesFromLeftToRight(bar1,bar2);//left:bar1 
    System.out.print(bar2.getX+bar2.getY)// hey there 
} 

setNewValuesFromLeftToRight: cette méthode se tout objet 2 avec les mêmes valeurs de champ catégoriels et de bar2 en utilisant des valeurs de champ, qui ne sont pas nuls, de bar1
Qu'est-ce la meilleure façon d'écrire la méthode setNewValuesFromLeftToRight? sûr qu'il devrait être une solution générique. Est-ce que j'utiliser les Reflections?valeurs de champ de réglage à une autre instance de la même classe

+0

Nous ne pouvons pas deviner ce que vous voulez que la fonction à faire. – bmargulies

+0

Alors, qu'est-ce que 'setNewValuesFromLeftToRight()' est censé faire ici? Est-ce que cela définit simplement tous les champs de bar2 aux valeurs des champs correspondants dans bar1? –

+0

Je viens d'essayer de le décrire – dupdup

Répondre

2

La façon dont je lis ces conditions que toute propriété dans le bean droit (cible) doit être remplacé si il y a une valeur non nulle correspondante dans le bean (source) gauche. C'est donc légèrement différent de PropertyUtils.copyProperties qui remplacerait toutes les propriétés (y compris les valeurs de source nulles).

Une possibilité serait d'utiliser Jakarta Commons BeanUtils, vous pouvez utiliser

PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(leftBean); 
if (descriptors != null) { 
    for (PropertyDescriptor descriptor : descriptors) { 
    try { 
     String propertyName = descriptor.getName(); 
     Object val = PropertyUtils.getProperty(leftBean, name); 
     if (val != null) { 
     PropertyUtils.setProperty(rightBean, name, val); 
     } 
    } catch (Exception ignore) { 
     // not interested in what we can't read or write 
    } 
    } 
} 
+0

Je pense que cela ferait l'affaire beaucoup je vais l'essayer demain – dupdup

0

Si vous voulez avoir une telle fonction et qu'elle doit être générique, la seule façon d'utiliser la réflexion. Vous devez passer en revue toutes les variables et vérifier les setters publics et getters et l'utiliser. Si vous le souhaitez pour des classes particulières, une version modifiée de copy constructor devrait faire l'affaire

+0

la construction de copie n'est pas la solution que la fonctionnalité demandée est ** fusionner ** plutôt que ** clone ** – bmichalik

1

Au lieu de le faire à la main, vous pouvez utiliser Commons BeanUtils.

BeanUtils.copyProperties(bar2, bar1); 
+0

Hmmm, En regardant la question pour la première fois, je pensais qu'il essaie copier toutes les propriétés mais apparemment pas. Il essaye d'ajouter les valeurs pas les remplacer –

+0

im chiant BeanUtils et @teja oui Im essayant de copier de gauche à droite qui ne sont pas nul comme dans l'exemple bar1 a y: null – dupdup

0

Si les champs Foo étaient publics, vous pouvez copier ensuite les champs directement en utilisant la réflexion. Cependant, vous ne voulez pas vraiment rendre tous vos champs publics, n'est-ce pas? ;-)

Si vous avez une convention acceptée telle que celle utilisée par Java Beans, où chaque champ a besoin d'une méthode "get" et "set" correspondante, vous pouvez boucler toutes les méthodes getter du premier objet, appelez-les et transmettez les valeurs résultantes aux méthodes setter du second objet. Cependant, cela ne fonctionnera pas pour les champs qui n'ont pas les bons getters et setters.

Questions connexes