Generiká
Posledná prednáška
Stiahnuť PDF · 4,9 MBPreber si túto poznámku so svojou AI
Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.
Náhľad poznámky
Generiká
Informatika 2
Pojmy zavedené v 10. prednáške(1)
• štandardný vstup a výstup
• textové súbory
• binárne súbory
• objektové prúdy
Informatika 2
1
Pojmy zavedené v 10. prednáške(2)
• objektové prúdy
– nečitateľné pre človeka
• čítanie (deserializácia):
ObjectInputStream + FileInputStream (+ File)
• zapisovanie (serializácia):
DataOutputStream + FileOutputStream (+ File)
• celé objekty
Informatika 2
2
Pojmy zavedené v 10. prednáške(3)
• tvorba softvéru - životný cyklus softvéru
• modely životného cyklu
– vodopádový
– špirálový
– RUP
– agilné metodiky (XP, Scrum,...)
Informatika 2
3
Pojmy zavedené v 10. prednáške(4)
• základné činnosti životného cyklu
• analýza
• návrh
• implementácia
• testovanie
• nasadenie (údržba)
Informatika 2
4
Pojmy zavedené v 10. prednáške(5)
• jednoduché prostriedky analýzy
• metóda verb&noun
– podstatné mená - triedy; štruktúra
– slovesá - zodpovednosti tried; chovanie
• karty CRC
– class-responsibility-colaborators
Informatika 2
5
Pojmy zavedené v 10. prednáške(6)
• scenár
• testovanie scenára
• návrh rozhrania tried
• implementácia prototypu
• dokumentácia
Informatika 2
6
Cieľ prednášky
• generiká
• príklad: všeobecný katalóg
Informatika 2
7
Všeobecný katalóg – zadanie
• rozšírenie katalógu z KCaIB
• univerzálnejšie riešenie
– katalóg kníh
– katalóg automobilov
Informatika 2
8
9
Informatika 2
Katalóg kníh vs. katalóg áut(1)
10
Informatika 2
Katalóg kníh vs. katalóg áut(2)
Trieda KatalogAut
public KatalogAut() {
aZoznamPoloziek = new ArrayList<Auto>();
}
public void pridaj(Auto paNovaPolozka) {
aZoznamPoloziek.add(paNovaPolozka);
}
public void vypisPolozky() {
for (Auto polozka : aZoznamPoloziek) {
System.out.println(polozka);
System.out.println("===========");
}
}
Informatika 2
11
Trieda KatalogKnih
public KatalogKnih() {
aZoznamPoloziek = new ArrayList<Kniha>();
}
public void pridaj(Kniha paNovaPolozka) {
aZoznamPoloziek.add(paNovaPolozka);
}
public void vypisPolozky() {
for (Kniha polozka : aZoznamPoloziek) {
System.out.println(polozka);
System.out.println("===========");
}
}
Informatika 2
12
Riešenie
• polymorfizmus
• čo použiť ako spoločný typ?
– interface IPolozkaKatalogu
– abstraktná trieda PolozkaKatalogu
– trieda Object
• riešenie s Object vyhovuje
– katalóg posiela položkám len správu toString
Informatika 2
13
Riešenie pomocou Object
Informatika 2
14
Použitie (katalóg kníh)
Katalog mojKatalog = new Katalog();
mojKatalog.pridaj(
new Kniha("Bram Stocker", "Drakula"));
mojKatalog.pridaj(
new Kniha("Sharon Zakhour", "Java 6"));
...
Kniha drakula = mojKatalog.dajNaPozicii(0);
// chyba pri preklade
Kniha drakula = (Kniha)mojKatalog.dajNaPozicii(0);
Informatika 2
15
Použitie (katalóg áut)
Katalog mojKatalog = new Katalog();
mojKatalog.pridaj(new Auto("Peugeot", "207"));
mojKatalog.pridaj(new Auto("Škoda", "Oktávia"));
...
Auto oktavia = (Auto)mojKatalog.dajNaPozicii(1);
Informatika 2
16
Problém (znovu katalóg kníh)
Katalog mojKatalog = new Katalog();
mojKatalog.pridaj(
new Kniha("Bram Stocker", "Drakula"));
mojKatalog.pridaj(
new Kniha("Sharon Zakhour", "Java 6"));
... (o 100 riadkov ďalej a 3 týždne neskôr)
mojKatalog.pridaj(new Auto("Škoda", "Oktávia"));
...
Kniha drakula = (Kniha)mojKatalog.dajNaPozicii(2);
Informatika 2
17
Výsledok riešenia
• odstránili sme duplicity
• katalóg je príliš „univerzálny“
– umožňuje vkladať ľubovoľné objekty
• katalóg kníh = len pre knihy
• katalóg áut = len pre autá
• katalóg audiovizuálnych diel = len pre diela
Informatika 2
18
Generické triedy
• riešením je generická trieda
• definícia typu položky pri definícii premennej
• definícia typu položky pri vytváraní inštancie
Informatika 2
19
Typový parameter
• syntax:
• zoznam typových parametrov je čiarkami
oddelený
• jedná sa o typy – konvencia – prvé veľké
• definuje „typ“ prístupný v celej triede
Informatika 2
20
public class NazovTriedy<TypoveParametre>
Typový parameter – konvencie
• Java
– E – element kontajnera
– K – kľúč v Map
– V – hodnota v Map
– N – číslo
– T – všeobecný typ
– S, U, V... – ďalšie typy
• všeobecnejšia konvencia
– prvé písmeno T, pokračuje popisný názov
– TPolozka
Informatika 2
21
Trieda Katalog(1)
public class Katalog<TPolozka>
{
private ArrayList<TPolozka> aZoznamPoloziek;
...
}
Informatika 2
22
Trieda Katalog(2)
public Katalog() {
aZoznamPoloziek = new ArrayList<TPolozka>();
}
public void pridaj(TPolozka paNovaPolozka) {
aZoznamPoloziek.add(paNovaPolozka);
}
public void vypisPolozky() {
for (TPolozka polozka : aZoznamPoloziek) {
System.out.println(polozka);
System.out.println("===========");
}
}
Informatika 2
23
Použitie (katalóg kníh)
Katalog<Kniha> mojKatalog = new Katalog<Kniha>();
mojKatalog.pridaj(
new Kniha("Bram Stocker", "Drakula"));
mojKatalog.pridaj(
new Kniha("Sharon Zakhour", "Java 6"));
...
Kniha drakula = mojKatalog.dajNaPozicii(0);
Informatika 2
24
Použitie (katalóg áut)
Katalog<Auto> mojKatalog = new Katalog<Auto>();
mojKatalog.pridaj(new Auto("Peugeot", "207"));
mojKatalog.pridaj(new Auto("Škoda", "Oktávia"));
...
Auto oktavia = mojKatalog.dajNaPozicii(1);
Informatika 2
25
Vyriešený problém (znovu katalóg kníh)
Katalog<Kniha> mojKatalog = new Katalog<Kniha>();
mojKatalog.pridaj(
new Kniha("Bram Stocker", "Drakula"));
mojKatalog.pridaj(
new Kniha("Sharon Zakhour", "Java 6"));
... (o 100 riadkov ďalej a 3 týždne neskôr)
mojKatalog.pridaj(new Auto("Škoda", "Oktávia"));
// chyba pri preklade
Informatika 2
26
Výhody využitia generickej triedy
• úplná typová kontrola pri preklade
• netreba pretypovávať
• nie je možné vložiť položku iného typu
Informatika 2
27
28
Informatika 2
Riešenia generických tried v jazykoch(1)
prekladač
new Katalog<Kniha>
new Katalog<Auto>
29
Informatika 2
Riešenia generických tried v jazykoch(2)
behové prostredie
(napr. JVM)
new Katalog<Kniha>
new Katalog<Auto>
30
Informatika 2
Riešenia generických tried v jazykoch(3)
prekladač
new Katalog<Kniha>
new Katalog<Auto>
Riešenie v jazyku Java
• tretia možnosť
• špeciálny proces pri preklade
– type erasure – odstraňovanie typov
– zmena typových parametrov na typ Object
– pridanie pretypovaní
Informatika 2
31
Problémy použitého riešenia
• nefunguje „new TypovyParameter“
• nefunguje „instanceof TypovyParameter“
• dá sa vytvoriť príliš všeobecná implementácia
pomocou
Informatika 2
32
new Katalog()
Príklad – prvé dva problémy
public class Katalog<TPolozka>
{
…
TPolozka implicitnaHodnota = new TPolozka();
…
if (objekt instanceof TPolozka) {
TPolozka polozka = (TPolozka)objekt;
}
…
}
Informatika 2
33
Tretí problém
• nerobí sa typová kontrola
• zobrazí sa varovanie:
Informatika 2
34
Katalog vseobecny = new Katalog();
Rozšírenie zadania
• chceme v katalógu vyhľadávať
– nájsť knihu podľa titulu/autora
– nájsť auto podľa ŠPZ
– ...
Informatika 2
35
Klasické riešenie
• každá položková trieda dostane správu
obsahuje(ret)
– ret = porovnávaný reťazec
• katalóg sa každej položky spýta, či obsahuje
hľadaný reťazec
• vráti prvú položku, pre ktorú obsahuje(ret) vráti
true
– ret = hľadaný reťazec
Informatika 2
36
Metóda Kniha.obsahuje
public boolean obsahuje(String paHodnota)
{
return aAutor.equals(paHodnota)
|| aTitul.equals(paHodnota);
}
Informatika 2
37
Máme problém
Informatika 2
38
Chyba pri preklade
• prekladač nevie, že všetky položky budú mať
správu obsahuje
• riešenie:
– polymorfizmus
• čo s generikami?
Informatika 2
39
Generiká a polymorfizmus
Informatika 2
40
Tri možnosti riešenia
• interface ako typ do aZozamPoloziek
• nahradiť TPolozka za IPorovnaj
• obmedzenie typového parametra
Informatika 2
41
Interface ako typ do aZozamPoloziek
=>
• zachováme generickú triedu
• musíme pridať pretypovania z TPolozka na
IPorovnaj
• pri preklade sa nekontroluje, či sú položky
IPorovnaj
Informatika 2
42
private ArrayList<TPolozka> aZoznamPoloziek;
private ArrayList<IPorovnaj> aZoznamPoloziek;
Metóda Katalog.pridaj
public class Katalog<TPolozka>
{
private ArrayList<IPorovnaj> aZoznamPoloziek;
...
public void pridaj(TPolozka paNovaPolozka)
{
aZoznamPoloziek.add((IPorovnaj)paNovaPolozka);
}
}
Informatika 2
43
Metóda Katalog.pridaj – lepšie riešenie
public void pridaj(TPolozka paNovaPolozka)
{
if (paNovaPolozka instanceof IPorovnaj) {
aZoznamPoloziek.add((IPorovnaj)paNovaPolozka);
}
}
Informatika 2
44
Nahradenie TPolozka za IPorovnaj
• prestávame používať generickú triedu
• nahrádzame za klasický polymorfizmus
Informatika 2
45
Metóda Katalog.pridaj
public class Katalog
{
private ArrayList<IPorovnaj> aZoznamPoloziek;
public void pridaj(IPorovnaj paNovaPolozka)
{
aZoznamPoloziek.add(paNovaPolozka);
}
…
}
Informatika 2
46
Obmedzenie typového parametra
• špeciálna syntax
• definovanie, aké typy môžu byť použité ako
hodnota typového parametra
• kontrola typového parametre pri preklade
Informatika 2
47
<typovyParameter extends typ>
Trieda Katalog, obmedzenie
public class Katalog<TPolozka extends IPorovnaj>
{
private ArrayList<TPolozka> aZoznamPoloziek;
public void pridaj(TPolozka paNovaPolozka)
{
aZoznamPoloziek.add(paNovaPolozka);
}
…
}
Informatika 2
48
Nové zadanie
• prechádzanie katalógu pomocou foreach
Informatika 2
49
Konštrukcia foreach (opakovanie)
• je to isté ako
Informatika 2
50
for (TypPrvkov prvok : kontajner) {
// telo cyklu
}
Iterator<TypPrvkov> prst = kontajner.iterator();
while (prst.hasNext()) {
TypPrvkov prvok = prst.next();
// telo cyklu
}
Iterable a Iterator (opakovanie)
Informatika 2
51
Prechádzanie vlastného kontajnera
• treba implementovať interface Iterable<TItem>
• generický interface
Informatika 2
52
Implementácia interface Iterable
public class Katalog<TPolozka extends IPorovnaj>
implements Iterable<TPolozka>
{
…
public Iterator<TPolozka> iterator()
{
return aZoznamPoloziek.iterator();
}
…
}
Informatika 2
53
Generické interface
• Syntax
– podobne ako u triedy
• typy sa kontrolujú aj pri implementácii interface
triedou
Informatika 2
54
public interface NazovInterface<TypoveParametre>
Implementácia interface Iterable
public class Katalog<TPolozka extends IPorovnaj>
implements Iterable<TPolozka>
{
…
public Iterator<TPolozka> iterator()
{
return aZoznamPoloziek.iterator();
}
…
}
Informatika 2
55
Generické metódy
• syntax:
• príklad:
Informatika 2
56
modifikatory <TypoveParametre>
typNavratovejHodnoty nazovMetody(parametre);
private <T> void vypisVsetko(Iterable<T> paZoz);
Poslanie generickej správy
• syntax:
• príklad:
Informatika 2
57
adresat.<TypoveParametre>selektor(parametre);
private ArrayList<Integer> aCisla;
...
this.<Integer>vypisVsetko(aCisla);
Automatické odvodzovanie typov
• pri poslaní správy
• automaticky sa určí
• musí byť Integer
• iba ak sú všetky typové parametre použité vo
formálnych parametroch metódy
Informatika 2
58
private ArrayList<Integer> aCisla;
...
this.vypisVsetko(aCisla);
Nové zadanie
• hromadné pridanie položiek z kontainera
ArrayList
Informatika 2
59
Metóda Katalog.pridajVsetky
public void pridajVsetky(
Iterable<TPolozka> paPolozky)
{
for (TPolozka pol : paPolozky) {
aZoznamPoloziek.add(pol);
}
}
Informatika 2
60
Katalóg audiovizuálnych diel
Informatika 2
61
Použitie pridajVsetky
Katalog<AudiovizualneDielo> katalog
= new Katalog<AudiovizualneDielo>();
...
ArrayList<AudiovizualneDielo> zoznam
= new ArrayList<AudiovizualneDielo>();
zoznam.add(new CD("Beatles"));
...
katalog.pridajVsetky(zoznam);
Informatika 2
62
Použitie pridajVsetky, nefunguje
Katalog<AudiovizualneDielo> katalog
= new Katalog<AudiovizualneDielo>();
...
ArrayList<CD> zoznam = new ArrayList<CD>();
zoznam.add(new CD("Beatles"));
...
katalog.pridajVsetky(zoznam);
Informatika 2
63
Použitie pridajVsetky, nefunguje
Informatika 2
64
Divoké karty – wildcards
• definícia premennej
• typový parameter bez konkrétneho typu
• napr.
– miesto
Informatika 2
65
ArrayList<? extends TPolozka> paPolozky
ArrayList<TPolozka> paPolozky
Metóda pridajVsetky, divoké karty
public void pridajVsetky
(Iterable<? extends TPolozka> paPolozky)
{
for (TPolozka pol : paPolozky) {
aZoznamPoloziek.add(pol);
}
}
Informatika 2
66
Java 7 – diamantový operátor
• zjednodušenie zápisu
• príklad:
• sa dá zapísať ako
Informatika 2
67
ArrayList<String> poznamky
= new ArrayList<String>();
ArrayList<String> poznamky = new ArrayList<>();
diamond operator
Vďaka za pozornosť
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky