Asociace mezi objekty
Proč to potřebuji?
Reálné programy se skládají z mnoha spolupracujících objektů. Asociace popisují, jak jsou objekty propojeny, a správná implementace těchto vztahů je klíčem k čistému návrhu aplikace.
Teorie
Asociace je vztah mezi dvěma třídami/objekty. V UML se zobrazuje jako čára mezi třídami s popisem kardinalit (1:1, 1:N, M:N).
Agregace (prázdný kosočtverec) – volný vztah, podřízený objekt může existovat nezávisle. Kompozice (plný kosočtverec) – silný vztah, podřízený objekt nemůže existovat bez nadřazeného.
Při převodu UML do Javy se asociace implementuje jako atribut (reference). Kardinalita 1 = jednoduchý atribut, kardinalita N = kolekce (List, Set).
Příklady
// Agregace: Ucitel existuje nezávisle na Škole
public class Skola {
private String nazev;
private List<Ucitel> ucitele; // 1:N agregace
public Skola(String nazev) {
this.nazev = nazev;
this.ucitele = new ArrayList<>();
}
public void pridejUcitele(Ucitel u) {
ucitele.add(u);
}
}
public class Ucitel {
private String jmeno;
public Ucitel(String jmeno) {
this.jmeno = jmeno;
}
}
// Kompozice: Mistnost nemůže existovat bez Budovy
public class Budova {
private List<Mistnost> mistnosti;
public Budova() {
this.mistnosti = new ArrayList<>();
}
// Místnost se vytváří UVNITŘ budovy
public Mistnost vytvorMistnost(String cislo) {
Mistnost m = new Mistnost(cislo);
mistnosti.add(m);
return m;
}
}
// Vnitřní třída – zdůrazňuje, že Mistnost patří Budově
public class Mistnost {
private String cislo;
Mistnost(String cislo) { // package-private konstruktor
this.cislo = cislo;
}
}
// UML → Java převod:
// Škola 1 ---<> * Ucitel → List<Ucitel> v třídě Skola
// Budova 1 ---■ * Mistnost → List<Mistnost> + tvorba uvnitř Budovy
Shrnutí
Klíčové body
- Asociace se převádí na atributy (reference) ve třídě
- Kardinalita 1 → jednoduchý atribut, N →
List/Set - Agregace = volný vztah, Kompozice = silný (životní cyklus řízen vlastníkem)
- Obousměrná asociace = reference na obou stranách