Bonjour,
Je voudrais savoir comment implémenter en Java les notions d'agrégation et composition.
Bonjour,
Je voudrais savoir comment implémenter en Java les notions d'agrégation et composition.
Bonjour,
Pour l'aggrégation, en Java c'est simple, tu en as une dès qu'une classe A référence une classe B. Il suffit d'écrire par exemple :
pour avoir une aggrégation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public class A { private B b; // [...] public B getB() { return b; } }
Pour la composition, c'est moins évident en Java, puisque c'est une aggrégation forte (ou aggrégation par valeur). Si on reprend l'exemple ci-dessus, il y aurait une composition entre A et B si une instance de A contenait une instance de B, c'est-à-dire si les deux instances étaient physiquement liées. C'est automatiquement le cas en C++ dès que tu écris le code ci-dessus par exemple, puisque les variables contiennent bien des valeurs, alors qu'en Java ce sont des références.
Mais en fait, la définition d'une composition signifie que A et B sont liées au point qu'une instance de B n'existe que pour une instance donnée de A, et que la disparition de cette dernière entraînera aussi celle de l'autre. En Java, on peut obtenir ça avec une bonne encapsulation. Par exemple :
à condition que B soit clonable et que l'instance en question ne soit accessible de nulle part ailleurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public class A { private B b; public A() { b = new B(); } public B getB() { return b.clone(); } }
Dans ces conditions-là en effet, une instance de B est créée pour chaque instance de A, et lui est intimement liée. Elle n'est accessible à personne d'autre (à cause du clonage), et si l'instance de A disparaît, celle de B qui lui était attachée devient inaccessible. C'est donc bien une composition, même s'il n'y a pas contenance "par valeur".
En espérant t'avoir éclairé, joyeux Noël et a+.
Je pense que ledoit figurer dans le premier exemple aussi pour qu'on puisse utiliser l'objet b.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public A() { b = new B(); }
Dans le premier exemple, le ramasse-miettes détruira l'objet b à la destruction de l'objet a puisque c'est un champs de a. Non ?
Non, justement dans l'exemple de l'aggrégation l'instance de B n'est pas exclusive à celle de A, elle peut être partagée et venir de l'extérieur. En particulier, elle peut très bien avoir été définie avec :
Avant de te répondre je me suis rafraîchi la mémoire avec cette page : http://uml.developpez.com/cours/. C'est plutôt bien fait et assez concis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public void setB(B b) { this.b = b; }.
Merci beaucoup !
Partager