PDF

Generiká

Posledná prednáška

Formát
PDF
Veľkosť
4,9 MB
Pridané
Stiahnutí
924
Stiahnuť PDF · 4,9 MB

Preber 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.

Otvoriť AI: ChatGPT · Claude · Gemini

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.