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 !
On ne peut pas vraiment deviner en Java s'il s'agit d'une aggrégation ou d'une composition. Le reverse engineering en UML ne permet pas de détecter s'il s'agit d'une composition ou d'une aggrégation. Toutefois en partant du principe que dans 90% des cas selon le type de multiplicité est couvert, le reverse peut estimer qu'il s'agit d'une composition ou d'une aggrégation en fonction des multiplicity d'association. Cette information est toutefois hypothétiquement correcte mais non certaines !!
A ce moment l'utilisation d'UML apporte une information supplémentaire au code java et l'UML permet d'enrichir java et d'y apporter des notions supplémentaires qui ne sont pas codable![]()
Partager