Cvičenie 4 - Rozhrania, Finálne triedy, metódy a premenné, Ošetrenie výnimiek

Cieľom štvrtého cvičenia je precvičiť si vytváranie rozhraní, definovanie finálnych typov a základné ošetrenie výnimiek. Názvy a typ premenných a metód sú zapísané v UML notácii.

Úlohy

Úloha 4.1

Vytvorte rozhranie Zariadenie s metódami zapni(): void a vypni(): void.

public interface Zariadenie {
public void zapni();
public void vypni();
}
view raw Zariadenie.java hosted with ❤ by GitHub

Úloha 4.2

Vytvorte rozhranie Termostat s metódou nastavTeplotu(teplota: int): void.

public interface Termostat extends Zariadenie {
public void nastavTeplotu(int teplota);
}
view raw Termostat.java hosted with ❤ by GitHub

Úloha 4.3

Vytvorte abstraktnú triedu ZakladneZariadenie, ktoré implementuje rozhranie Zariadenie. Do triedy pridajte chránené premenné stav: boolean a nazov: String. Do triedy pridajte konštruktor ZakladneZariadenie(nazov: String), ktorý nastaví členskú premennú nazov. Implementujte metódy zapni(): void tak, aby ak zariadenie nie je ešte zapnuté, nastaví stav na true a vypíše správu "zariadenie zapnuté" a metódu vypni(): void tak, aby ak zariadenie nie je vypnuté nastavilo stav na false a vypíše správu "zariadenie vypnuté".

public abstract class ZakladneZariadenie implements Zariadenie {
protected String nazov;
protected boolean stav;
public ZakladneZariadenie(String nazov) {
this.nazov = nazov;
// premennú stav nie je potrebné inicializovať na 'false', ale je to vhodnné pre lepšiu čitateľnosť
this.stav = false;
}
@Override
public void zapni() {
if (! this.stav) {
this.stav = true;
System.out.println("zariadenie zapnuté");
}
}
@Override
public void vypni() {
if (this.stav) {
this.stav = false;
System.out.println("zariadenie vypnuté");
}
}
}

Úloha 4.4

Vytvorte triedu Osvetlenie odvodenú z triedy ZakladneZariadenie implementujúcu rozhranie Zariadenie. Pridajte konštruktor Osvetlenie(nazov: String), ktorý volá konštruktor nadradenej triedy. Predefinujte metódu zapni(): void a vypni(): void tak aby sa najprv otestovalo či už zariadenie nie je zapnuté resp. vypnuté, potom sa zavolala implementácia nadradenej triedy a nakoniec sa vypísala správa "osvetlenie zapnuté" resp. "osvetlenie vypnuté".

public class Osvetlenie extends ZakladneZariadenie implements Zariadenie {
public Osvetlenie(String nazov) {
super(nazov);
}
@Override
public void zapni() {
if (! this.stav) {
super.zapni();
System.out.println("osvetlenie zapnuté");
}
}
@Override
public void vypni() {
if (this.stav) {
super.vypni();
System.out.println("osvetlenie vypnuté");
}
}
}
view raw Osvetlenie.java hosted with ❤ by GitHub

Úloha 4.5

Vytvorte triedu Vykurovanie odvodené od triedy ZakladneZariadenie implementujúce rozhrania Zariadenie a Termostat. Do triedy pridajte členskú premennú teplota: int. Pridajte konštruktor Vykurovanie(nazov: String), ktorý volá konštruktor nadradenej triedy. Predefinujte metódy zapni(): void a vypni(): void tak, aby sa pri zapnutí nastavila teplota na 25 a pri vypnutí na 0. Pridajte implementáciu nastavTeplotu(teplota: int): void, ktorá nastaví teplotu a vypíše správu "aktuálna teplota: [teplota]".

public class Vykurovanie extends ZakladneZariadenie implements Zariadenie, Termostat {
/*
statické premenné uveďte v triede ako prvé, potom uveďte normálne premenné usporiadané podľa prístupu
najpr. 'public', 'protected' a nakoniec 'private'
podobne usporiadajte metódy (najprv uveďte konštruktory)
*/
private static final int MAX_TEPLOTA = 40;
private int teplota;
public Vykurovanie(String nazov) {
super(nazov);
}
@Override
public void zapni() {
if (! stav) {
nastavTeplotu(25);
super.zapni();
}
}
@Override
public void vypni() {
if (stav) {
nastavTeplotu(0);
super.vypni();
}
}
@Override
public void nastavTeplotu(int teplota) {
if (teplota < 0 || teplota > MAX_TEPLOTA) {
throw new IllegalArgumentException("teplota je mimo rozsah");
}
this.teplota = teplota;
System.out.println("aktuálna teplota: " + this.teplota);
}
}

Úloha 4.6

Vytvorte triedu Dom, ktorá bude mať členské premenné vykurovanie: Vykurovanie a osvetlenie: Osvetlenie. Pridajte konštruktor, ktorý nastaví členské premenné. Pridajte metódy zapniSvetlo(): void, vypniSvetlo(): void, zapniKurenie(): void, vypniKurenie(): void a nastavTeplotu(teplota: int): void, ktoré volajú zodpovedajúce metódy členských premenných.

public class Dom {
private Vykurovanie vykurovanie;
private Osvetlenie osvetlenie;
public Dom(Vykurovanie vykurovanie, Osvetlenie osvetlenie) {
this.osvetlenie = osvetlenie;
this.vykurovanie = vykurovanie;
}
public void zapniSvetlo() {
this.osvetlenie.zapni();
}
public void vypniSvetlo() {
this.osvetlenie.vypni();
}
public void zapniKurenie() {
this.vykurovanie.zapni();
}
public void vypniKurenie() {
this.vykurovanie.vypni();
}
public void nastavTeplotu(int teplota) {
this.vykurovanie.nastavTeplotu(teplota);
}
}
view raw Dom.java hosted with ❤ by GitHub

Úloha 4.7

Vytvorte triedu Program do ktorej pridajte metódu main. V metóde main vytvorte jeden dom, zapnite svetla, zapnite kúrenie a nastavte teplotu na 30 stupňov.

Úloha 4.8

Do triedy Vykurovanie pridajte statickú finálnu premennú MAX_TEPLOTA: int, ktorú nastavte na 40 stupňov.

Úloha 4.9

V triede Vykurovanie upravte metódu nastavTeplotu(teplota: int): void tak aby ak je teplota menej ako 0, alebo viac ako MAX_TEPLOTA sa vyvolá výnimka IllegalArgumentException so správou, že teplota je mimo rozsahu.

Úloha 4.10

Upravte metódu main tak aby ste otestovali nastavenie teploty a ošetrili výnimku IllegalArgumentException. Pri obsluhe chyby vypíšte správu a nastavte teplotu na 25 stupňov. Pridajte aj kód, ktorý sa na konci vykoná vždy (aj keď došlo k chybe) a ktorý vypne kúrenie.

public class Program {
public static void main(String args[]) {
Dom dom = new Dom(new Vykurovanie("vykurovanie 1"), new Osvetlenie("osvetlenie 1"));
dom.zapniSvetlo();
dom.zapniKurenie();
try {
dom.nastavTeplotu(100);
} catch (IllegalArgumentException chyba) {
System.out.println(chyba.getMessage());
dom.nastavTeplotu(25);
} finally {
dom.vypniKurenie();
}
}
}
view raw Program.java hosted with ❤ by GitHub