Objektovo-orientované programovanie, ak. rok 2022/23

Cvičenie 6

(k prednáške 6)

späť


Projekt

Pokračujte v práci na projekte. Prípadne už na tomto cvičení prezentujte pracovnú verziu programu.

^


Úlohy

  1. Preštudujte rôzne spôsoby vytvárania nití prostredníctvom príkladov z prednášky. Triedy môžete uložiť do jedného projektu, ale v skutočnosti sú nezávislé a každá z nich sa spúšťa zvlášť.
    1. Čo sa stane, keď v triede Thread1 premenujete metódu run()?
    2. Čo sa stane, keď v triede Thread2 premenujete metódu run()?
    3. Všimnite si použitie referencie na metódu a lambda výrazu.
    4. Dokončte triedu Thread5 pridaním zodpovedajúcej anonymnej triedy. Vychádzajte z triedy Thread2.
  2. Experimentujte so synchronizáciou nití prostredníctvom príkladu Incrementer-Printer z prednášky.
    1. Čo sa stane, keď odstránite kľúčové slovo synchronized z jedného alebo oboch miest, na ktorých sa vyskytuje?
    2. Všimnite si, že synchronizácia vlastne znamená uzamknutie objektu pre určitý kritický región (blok kódu). Identifikujte kritické regióny a objekt v príklade Incrementer-Printer. Nahraďte synchronizáciou celej metódy synchronizáciou bloku kódu (poskytnutá v komentári). Zmení sa niečo?
    3. (Na domácu úlohu.) Prerobte príklad Incrementer-Printer tak, aby nevyužíval žiadne statické prvky. Aký objekt má byť uvedený vo výraze synchronized(), ak uplatnite synchronizáciu na úrovni bloku kódu ako v predchádzajúcej úlohe?
  3. Vyskúšajte príklad s delením a to ako bez ošetrených výnimiek, tak aj s ošetrenými výnimkami. Ak používate Eclipse, argumenty programu zadajte pomocou voľby Run Configurations…
  4. Experimentujte s kódom hry s obrami a rytiermi z prednášky, v ktorom je ošetrený nerovnaký počet obrov a rytierov zavedením a ošetrením zodpovedajúcej výnimky. Toto je tzv. kontrolovaná výnimka: musí byť ošetrená. Čo sa stane, ak odstránite jej ošetrenie (try-catch blok)? Zostáva tam ešte jeden problém: používateľ vôbec nemusí zadať čísla. Ako by ste ošetrili toto?
  5. Všimnite si ošetrenie výnimky NoSuchElementException v prijímači tlačidla nextClashButton v triede ClashWindow. Toto je výnimka typu RunTimeException, a tie sa nekontrolujú, t. j. prekladač nevnucuje ich ošetrenie (tri ďalšie typy nekontrolovaných výnimiek ste mali možnosť vidieť v príklade s delením). Ošetrenie výnimiek pri použití triedy Task<V>, ktorá sa používa na spustenie výpočtu mimo nite, v ktorej sa vykonáva GUI (JavaFX), je trochu zložitejšie, lebo táto trieda nepropaguje výnimky priamo, ale ich eviduje. Prijímač tlačidla nextClashButton v triede ClashWindow demonštruje dva varianty zachytenia výnimky NullPointerException (ďalšia nekontrolovaná výnimka): cez sledovanie zlyhania úlohy a cez sledovanie objektu, ktorý sa používa na ukladanie výnimiek.
  6. Pozrite príklad s výnimkou pri prekonávajúcej metóde. Prekonávajúca metóda nemôže zaviesť nový typ výnimky. Musí sa držať typov výnimiek, ktoré deklarovala metóda, ktorú prekonáva. V našom príklade by sa klientsky kód (trieda C) mohol spoliehať na všeobecnejšiu deklaráciu metódy m() v triede A a ignorovať výnimku typu Exception. Čo by sa stalo, keby metóda B.m() deklarovala, že vyhadzuje výnimku MySubexception odvodenú od výnimky MyException? Treba v takom prípade upravovať blok spracovania výnimky v klientskom kóde?
  7. V hre z prednášky pribudla aj metóda na spočítanie bojovníkov (Game.countWarriors()). Do GUI sú zaradené aj príslušné ovládacie prvky. Všimnite si použitie metódy isInstance() (namiesto operátora instanceof) na zisťovanie typu bojovníka a zabezpečenie kontroly typu s využitím generickosti triedy Class. Ktorá trieda implementuje metódu isInstance()? Pozrite túto triedu v dokumentácii Java API a čo všetko prostredníctvom nej možno zisťovať.

^



Valentino Vranić
vranic at stuba.sk