IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

1. diel - Úvod do kolekcií a genericita v Jave

V dnešnej lekcii si povieme úvodnú teóriu ku kolekciám v Jave, ktoré si v tomto kurze podrobnejšie rozoberieme.

Kolekcia

Pojem kolekcia označuje súbor dát, ktoré sú väčšinou rovnakého typu a slúžia na špecifický účel. Počas kurzov sme sa už stretli s dvoma typmi kolekciou, bolo to pole a ArrayList. Kolekcií existuje veľké množstvo a hoci sa zvonku mnohokrát tvária podobne, vo vnútri fungujú veľmi odlišne a vyberáme si ich podľa konkrétneho účelu. Java disponuje veľkým množstvom predpripravených kolekcií, s ktorými sa v tejto sekcii postupne zoznámime a skúsime sa s nimi pracovať.

Generické a všeobecné kolekcie

Keď sa zamyslíme nad tým, ako by sme si urobili vlastnú kolekciu, určite by sme po nejakej dobe dospeli k problému. Bol by ním dátový typ kolekcie. Chceli by sme si napr. Naprogramovať vlastný ArrayList, vytvorili by sme triedu MujList.java, do nej pridali príslušnej metódy a všetko potrebné. Pretože však chceme, aby bola naša kolekcia univerzálne a vedela teda ukladať napr. Ako int y, tak užívateľov, bude problém s dátovým typom prvkov vnútri kolekcie. Existujú 2 varianty, ako tento problém vyriešiť a aj samotná Java obsahuje kolekcie týchto 2 typov.

Všeobecné kolekcia

Keďže vieme, že všetky dátové typy majú ako predka triedu Object, môžeme prvky v našej kolekcii ukladať práve do tohto dátového typu. Do kolekcie teraz môžeme uložiť v podstate čokoľvek. Nevýhodou je, že sama kolekcia skutočný dátový typ prvkov nepozná a preto vie prvky navracať len ako všeobecné objekty. Po získaní prvku z kolekcie si ho teda musíme pretypovať.

Uveďme si príklad kolekcie, u ktorej neuvedieme generický typ:

ArrayList list = new ArrayList();
list.add("položka");

String polozka = (String)list.get(0);

Po vytvorení listu si doň pridáme položku typu String. Aby sme túto položky mohli z listu získať späť, treba ju na String spätne pretypovať.

Pre funkčnosť kódu musíme pridať import java.util.ArrayList;.

Generické kolekcia

Generické kolekcia rieši problém s dátovým typom na úrovni jazyka Java. Zavádza tzv. Genericitu. Zjednodušene povedané sa jedná o možnosť špecifikovať typ údajov až vo chvíli vytvorenie inštancie. V triede samotnej kolekcie sa potom pracuje s generickým typom, ktorý slúži ako zástupca pre budúce dátový typ. Môžeme si to predstaviť tak, že sa generický typ v triede zmení napr. Na String vo chvíli, keď vytvoríme jej inštanciu. Jedná sa teda o možnosť triedy nejakým spôsobom parametrizovať.

Generický ArrayList už poznáme a onen dátový typ (parameter) sa generickým triedam špecifikuje vo špicatých zátvorkách. Máme možnosť špecifikovať dátový typ iba raz, pri vytvorení kolekcie. Akékoľvek ďalšie pretypovanie odpadá:

ArrayList<String> list = new ArrayList<String>();
list.add("položka");

String polozka = list.get(0);

Program funguje úplne rovnako, ako ten s negenerické kolekciou ArrayList, však čítať môžeme bez nepohodlného pretypovanie.

Generické kolekcia nahradili kolekcia všeobecné a tie sa už príliš nepoužívajú. V kurze sa budeme venovať generickým kolekciám a ich negenerické verzie len zmienime.

Genericita

Genericita je samozrejme vlastnosť jazyka Java a my ju máme možnosť vo svojich triedach používať.

Zatiaľ sa nebudeme zaťažovať tvorbou vlastnej kolekcie. Vytvorme si triedu, ktorá bude jednoducho spravovať jednu premennú. Premenná bude generická, teda ľubovoľného dátového typu. Založte si nový projekt, konzolovú aplikáciu s názvom Genericita. Pridajte si novú triedu, pomenujte ju teraz pre študijné účely iba Trida. V jej deklarácii pridáme generický parameter, ktorý pomenujeme T:

public class Trida<T> {

}

Generických parametrov môžeme zadať vo špicatých zátvorkách viac, oddelíme ich čiarkou. Niekedy sa to môže hodiť, my sa s tým stretneme ďalej u generických máp.

Presunieme sa do metódy main(), kde si vytvoríme inštanciu našej triedy:

Trida<Integer> instance = new Trida<>();

Nezabudneme na špicaté zátvorky ako u dátového typu, tak u konstruktoru. Od Javy 7 nie je potrebné pridávať dátový typ u konstruktoru. Teraz sme parametra T v tejto inštanciu triedy určili dátový typ Integer. Rovnako tak si môžeme urobiť ďalší inštanciu tej istej triedy a parametra T dať úplne iný dátový typ, napr. String. Stačí nám teda 1 trieda pre viac dátových typov.

Pokračujme a vytvorme si v triede atribút. T môžeme použiť ako bežný dátový typ:

private T promenna;

Triede ešte dodáme konštruktor, ktorý premennú inicializuje:

public Trida(T promenna) {
    this.promenna = promenna;
}

V main() aktualizujeme vytvorení inštancie:

Trida<Integer> instance = new Trida<>(10);

Teraz inštancie obsahuje atribút promenna, ktorý je typu Integer a nadobúda hodnoty 10.

Môžeme dokonca pridať metódu, ktorá bude mať naviac ďalšie generický parameter (iný, než má trieda). Mohla by vyzerať napr. Nasledovne:

public <T2> boolean porovnej(T2 a) {
    return promenna.equals(a);
}

Skúsime si teda porovnať náš Integer s nejakým iným typom:

instance.porovnej<String>("15");

Generický typ si Java dokáže odvodiť z parametra, takže ho nie je potrebné za názvom funkcie uvádzať.

Ďalšie konštrukcie

Pre úplnosť si ešte uveďme niekoľko konštrukcií.

Generický parameter triedy je možné bližšie špecifikovať, presnejšie obmedziť. Slúži na to kľúčové slovo extends. Môžeme tak nastaviť, že udaný dátový typ musí napr. Implementovať rozhranie Comparable:

public class Trida<T extends Comparable> {
    ...
}

Vďaka tomu môžeme na premenných typu T teraz vnútri triedy volať metódy z daného rozhrania. Samotné rozhranie môže opäť obsahovať generický parameter, aby sme generické typy mohli používať aj v hlavičkách jeho metód.

Nakoniec si ukážme, ako môžeme typ parametra obmedziť z hľadiska dedičnosti.

public class Trida<A extends B, B extends C, C> {

}

Vyššie sme deklarovali triedu s tromi generickými parametrami, kde A je potomkom B a B je potomkom C.

V budúcej lekcii, Java Collections Framework , sa pozrieme na List y, predstavíme si rôzne implementácie tejto kolekcie a ich výhody a nevýhody.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 377x (2.58 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Všetky články v sekcii
Kolekcie a prúdy v Jave
Preskočiť článok
(neodporúčame)
Java Collections Framework
Článok pre vás napísal Petr Štechmüller
Avatar
Užívateľské hodnotenie:
2 hlasov
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity