10 Balíčky, grafické znázornění tříd, základy zapozdření Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům balíčkům, grafickému znázornění tříd a základům zapouzdření.
Doba nutná k nastudování
2 – 2,5 hodiny
10.1 Rozhraní, implementace, signatura, kontrakt V úvodu tohoto bloku seznámíme s pojmy rozhraní, implementace, signatura a kontrakt. Pod pojmem rozhraní rozumíme množinu informací, které o sobě třída zveřejní (např. vše označené jako public). Vše, co nemá být zpřístupněno, tak označíme jako soukromé (tedy private). Pro příklad rozhraní tříd je možné nahlédnou do Java API.
10.2 Balíčky Při programování v jazyce Java se prakticky vždy používají balíčky (package). Balíčky umožňují organizovat větší projekty a členit programy na logické celky. Pomocí balíčky vytváříme tzv. jmenné prostory, přičemž v každém balíčku může být vždy jen jedna třída stejného názvu. Pokud chceme v programu mít dvě třídy (nebo i více tříd) se stejným názvem, tak je nutné každou z těchto tříd umístit do jiného balíčku. Z hlediska práce s balíčky můžeme říci, že se v zásadě jedná se o podobnou práci jako se složkami v operačním systému. Název balíčku také úzce souvisí s názvem třídy, neboť plný název třídy se skládá z uvedení balíčků a názvu třídy, např. třídy Math a String mají tyto plné názvy: java.lang.Math java.lang.String Při využívání tříd z balíčků je nutné uvádět příkaz import. Import není nutné uvádět pro balíček java.lang. Při vytváření většího počtu tříd je vhodné přemýšlet nad uspořádáním tříd tak, aby byl program členěn na nějaké logické celky.
KST/IZAPR - Základy programování
blok 10, strana 1 (5)
Michael Bažant
Pro předcházení konfliktů při volbě názvů balíčků je doporučeno používat doménové jméno v opačném pořadí (doménová jména jsou unikátní), např: import cz.upce.fei.izapr.matematika.Matice; import cz.upce.fei.izapr.matematika.*; Pro bezproblémovou kompilaci zdrojových souborů je nutné, aby struktura balíčků odpovídala struktuře složek (adresářů) na disku. Pro umístění třídy do balíčku používáme příkaz package, který je vždy (pokud chceme třídu do nějakého balíčku zahrnout) na prvním řádku dané třídy. Příkaz package může být ve zdrojovém souboru třídy vždy pouze jeden, pokud deklarujeme v jednom souboru více tříd, tak tyto třídy musí být vždy v jednom balíčku.
10.3 Java API Java API (Application Programming Interface) zajišťuje klíčové funkce programovacího jazyka Java. Obsahuje celou řadu užitečných tříd (každá třída v Java API je umístěna v balíčku), které lze okamžitě použít ve vlastních aplikacích. Základní API je tak rozsáhlé, že by bylo nad rámec tohoto dokumentu uvádět bližší informace. Java API se pro jednotlivé verze jazyka může značně lišit.
10.4 Grafické znázornění tříd Pro názorné znázornění obsahu tříd a vazeb mezi třídami se používá jazyk UML (Unified Modeling Language). Tento jazyk je natolik rozsáhlý, že je obsahem jiného kurzu. My se v rámci tohoto kurzu seznámíme s úplnými základy tohoto jazyka, přičemž se omezíme pouze na ikonu třídy, asociační vazbu mezi třídami a dědičnost. Nejprve se podíváme na ikonu třídy – viz Obrázek 1.
Obrázek 1: Ikona třídy
KST/IZAPR - Základy programování
blok 10, strana 2 (5)
Michael Bažant
V záhlaví ikony třídy je uveden název třídy, ve druhé části ikony třídy jsou uvedeny instanční proměnné třídy včetně datového typu a ve třetí části jsou uvedeny metody včetně návratové hodnoty metody. Podtržením jednotlivých prvků znázorňujeme skutečnost, že se jedná o statické proměnné, případně statické metody.
10.5 Přístupová práva V jazyce Java jsou k dispozici základní 4 přístupová práva: default - neuvádí se žádný modifikátor (bez klíčového slova), třída, data nebo metody jsou přístupné pouze v daném balíčku. Graficky znázorňujeme přístupové právo default pomocí symbolu ~. public - třída, data nebo metody jsou přístupné jakýmkoliv třídám v libovolném balíčku. Graficky znázorňujeme přístupové právo public pomocí symbolu +. private - data nebo metody jsou přístupné pouze v deklarující třídě. Graficky znázorňujeme přístupové právo private pomocí symbolu -. protected – k bližším informacím o tomto modifikátoru bude uvedeno v části věnované dědičnosti. Graficky znázorňujeme přístupové právo protected pomocí symbolu #.
U implicitního konstruktoru jsou přístupová práva vždy stejná jako přístupová práva třídy.
10.6 Základy zapouzdření Pod pojmem zapouzdření rozumíme zamezení přístupu k hodnotám atributů objektů (z důvodu bezpečnosti). Atributy objektů tedy označíme jako privátní a nebudou svému okolí k dispozici pro čtení ani zápis. Pokud je nutné zabezpečit přístup k privátním atributům objektů, tak se používají metody, v jejich tělech máme možnost omezit operace, které budou s daným atributem povolené a tedy bezpečné. Tato praktika je znázorněna na následujícím obrázku - Obrázek 2. Data patřící jednomu objektu jsou tedy skryta objektům dalším, přičemž důležité je mít informace o tom, jaké operace objekt může realizovat, nikoliv jak je realizuje (rozhraní vs. implementace). Skrývání informací (information hiding) zvyšuje stupeň nezávislosti, nezávislost modulů je důležitá pro výstavbu větších systémů a jejich údržbu.
KST/IZAPR - Základy programování
blok 10, strana 3 (5)
Michael Bažant
Cílem zapouzdření je dosáhnout skrytí implementačních detailů třídy a nutit uživatele využívat rozhraní pro přístup k datům, což má za následek lepší údržbu zdrojového kódu. Mezi základní zásady tedy patří atributy tříd definovat privátní a pouze metody zamýšlené pro používání jinými třídami mají být veřejné (public).
Obrázek 2: Ikona třídy s přístupovými právy
Pokud bychom tento přístup neuplatňovali, mohlo by docházet k zadávaní neplatných dat do programů apod. – viz Obrázek 3.
Obrázek 3: Veřejné atributy objektu
Příklad: d.den = 32; // neplatny den d.mesic = 2; d.den = 30; // mozne, ale spatne d.den = d.den + 1; // zadne overeni platnosti
Otázky na procvičení 1. 2. 3. 4. 5.
Jak znázorníme přístupová práva default v ikoně třídy? Jak znázorníme statické metody v ikoně třídy? Co znamená přístupové právo private? K čemu slouží balíčky? Jaký příkaz slouží pro definici balíčku?
KST/IZAPR - Základy programování
blok 10, strana 4 (5)
Michael Bažant
Odkazy a další studijní prameny 1. Java API - http://download.oracle.com/javase/6/docs/api/ 2. Java Tutorial - http://docs.oracle.com/javase/tutorial/
KST/IZAPR - Základy programování
blok 10, strana 5 (5)
Michael Bažant