Copie D'objet dans un autre en gardant la référence initiale
Bonjour,
Afin de permettre un RollBack d'une opération j'effectue une copie de mon objet initial via une sérialisation. L'objet étant relativement complexe ( Il contient plusieurs ArrayList avec des objets tiers ) cela m'a semblé être la méthode la plus simple.
Seulement, en cas de problème, si je fais un objetInitial = objetSaved ma référence est changée... Et donc mon test Junit ne marche pas étant donné que l'objet créé en son sein pointe toujours vers l'ancienne référence...
Grosso modo j'ai ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public class TransactionDebitSure extends TransactionDebit{
Compte compte;
Compte compteCopie;
public TransactionDebitSure(Compte compte){
super(compte);
this.compte = compte;
}
public void beginTransaction(){
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(compte);
oos.flush();
oos.close();
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
compteCopie = (Compte)in.readObject();
System.out.println("Compte Copié");
System.out.println("Compte : "+compte.solde());
System.out.println("Compte Copie :"+compteCopie.solde());
} catch (IOException ioe){
ioe.getMessage();
} catch (ClassNotFoundException cnfe){
cnfe.getMessage();
}
}
public void endTransaction(){
compteCopie = null;
}
public void rollbackTransaction(){
System.out.println(compte);
System.out.println(compteCopie);
compte = null;
compte = (Compte)compteCopie.clone();
System.out.println("Apres : "+compte);
}
} |
Et dans mon JUNIT ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public void testTransactionDebitSure(){
Groupe g = new Groupe("g");
g.ajouter(new Cotisant("g_a",300));
g.ajouter(new Cotisant("g_b",200));
g.ajouter(new Cotisant("g_c",120));
Groupe g1 = new Groupe("g1");
g1.ajouter(new Cotisant("g1_a1",100));
g1.ajouter(new Cotisant("g1_b1",200));
g.ajouter(g1);
Banque b = new Banque();
b.installerLesCommandes( new TransactionDebitSure(g), new CommandeCrediter(g));
int ancienSolde = g.solde();
System.out.println("Dans test : "+g);
b.debiter(120);
System.out.println(" solde erroné, revoyez la transaction !!! "+ g.solde() +" = " + ancienSolde);
assertTrue(" solde erroné, revoyez la transaction !!! ", g.solde()==ancienSolde);
} |
Avec mes petits StackTrace j'obtiens ceci :
Citation:
Dans test : question1.Groupe@18b3e8b
Compte Copié
Compte : 920
Compte Copie :920
question1.Groupe@18b3e8b
question1.Groupe@1655659
Apres : question1.Groupe@81f03
solde erroné, revoyez la transaction !!! 560 = 920
Comme vous pouvez le constater je viens d'essayer en clonant mon nouvel objet dans l'initial, cela ne marche pas mieux. Quelqu'un pourrait t'il m'aiguiller?
Merci beaucoup.