Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Cvičení k 9. lekci OOP v Javě

Java Objektově orientované programování Cvičení k 9. lekci OOP v Javě American English version English version

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Následující 3 cvičení vám pomohou procvičit znalosti programování v Javě z minulé lekce. Ve vlastním zájmu se je pokuste vyřešit sami. Pod článkem máte pro kontrolu řešení ke stažení. Ale pozor, jakmile se na něj podíváte bez vyřešení příkladů, ztrácí pro vás cvičení smysl a nic se nenaučíte :)

Pokud si opravdu nebudete vědět rady, podívejte se raději znovu do minulého tutoriálu a pokuste se na to přijít.

Jednoduchý příklad

Naprogramujte aplikaci pro převod mezi stupni a radiány. Jelikož vše, co jste se učili ve škole, bylo ve stupních a vše, co se budete učit v programování, bude v radiánech, bude se vám znalost převodu hodit i do budoucna. Pokud vzorec neznáte, určitě si jej zvládnete jednoduše vyhledat :) Pro číslo Pí ve vzorci použijte konstantu na třídě Math. V aplikaci pro převody použijte třídu se statickými metodami.

Ukázka obrazovky programu:

Konzolová aplikace
6.28 radiánů na stupně: 359.81749534215703
90 stupňů na radiány: 1.5707963267948966

public class Prevodnik {
}

Středně pokročilý příklad

Naprogramujte aplikaci, která vyrábí cukroví. Každé cukroví má nějakou barvu, tvar a váhu. Existuje např. cukroví banánové, jahodové, čokoládové a další. Jednotlivé druhy cukroví se odlišují pouze hodnotami v atributech. Jelikož by bylo zbytečné tvořit pro každý druh cukroví třídu a zároveň je pracné zadávat konkrétní atributy znovu a znovu tam, kde potřebujeme konkrétní instanci cukroví, použijeme zjednodušenou podobu návrhového vzoru Factory.

Factory (továrna) se používá zejména v případě, kdy potřebujete velké množství různě nastavených instancí. Jedná se o třídu se statickými metodami, které vytvoří instanci, nastaví ji určité parametry a takto nastavenou instanci vrátí. Vytvořte takovouto továrnu a implementujte v ní metody pro výrobu banánového, jahodového a čokoládového cukroví. Následně v aplikaci touto továrnou vytvořte a vypište:

  • 5ks banánového cukroví
  • 8ks jahodového cukroví
  • 12ks čokoládového cukroví

Vaší továrně nastavte atributy pro dané cukroví podle výstupu níže.

Ukázka obrazovky programu:

Konzolová aplikace
Cukroví barvy žlutá, tvaru kulatý a váhy 20g
Cukroví barvy žlutá, tvaru kulatý a váhy 20g
Cukroví barvy žlutá, tvaru kulatý a váhy 20g
Cukroví barvy žlutá, tvaru kulatý a váhy 20g
Cukroví barvy žlutá, tvaru kulatý a váhy 20g
Cukroví barvy červená, tvaru kulatý a váhy 15g
Cukroví barvy červená, tvaru kulatý a váhy 15g
Cukroví barvy červená, tvaru kulatý a váhy 15g
Cukroví barvy červená, tvaru kulatý a váhy 15g
Cukroví barvy červená, tvaru kulatý a váhy 15g
Cukroví barvy červená, tvaru kulatý a váhy 15g
Cukroví barvy červená, tvaru kulatý a váhy 15g
Cukroví barvy červená, tvaru kulatý a váhy 15g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g
Cukroví barvy hnědá, tvaru hranatý a váhy 25g

public class Cukrovi {
}
public class TovarnaNaCukrovi {
}

Pokročilý příklad

Implementujte návrhový vzor Singleton. Singleton je populární a velmi kontroverzní návrhový vzor, jehož účelem je sdílení jedné jediné instance nějaké třídy v celé aplikaci. Třída Singleton (v praxi např. třída Databaze) obsahuje privátní konstruktor, čímž se zamezí tomu, aby od ní šla vytvořit instance. Tento kód tedy nebude fungovat:

Databaze databaze = new Databaze();

Smyslem je samozřejmě to, aby celá aplikace používala jednu instanci databáze, která se při startu aplikace k databázi připojí. Vytvoření nové instance Databaze by znamenalo nové připojení, což je velmi neefektivní. Proto instanciaci nedovolíme.

Na třídě se následně implementuje statická metoda getInstance(), která je jediným způsobem, jak instanci získat:

Databaze databaze = Databaze.getInstance();

Kdekoli v aplikaci můžeme napojenou instanci takto získat. Instance je uložena v privátním statickém atributu třídy Databaze.

Samozřejmě nebudeme pracovat s pravou databází, pouze si vytvořte třídy, které nepůjde instanciovat a jejíž instance půjdou získat přes statickou metodu. Funkčnost vzoru v aplikaci demonstrujte přes instanční atribut třídy Databaze, její jméno s hodnotou "MySQL", který vypište.

Singleton
MySQL

public class Databaze {
}

Ačkoli návrhový vzor Singleton patří mezi základní znalosti každého programátora, opravdu se v praxi spíše vyhněte jeho použití.


 

Stáhnout

Staženo 444x (59.02 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
5 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Miniatura
Předchozí článek
Statika
Miniatura
Následující článek
Gettery a settery v Javě
Aktivity (7)

 

 

Komentáře
Zobrazit starší komentáře (9)

Avatar
Peter Gasparik:22.2.2017 22:07

Ja som tu tovaren spravil takto a potom cez sout rovno nadefinoval a cez FOR nechal vypisat rovako ako bolo v zdrojaku, ach jaj a konecne som si myslel, ze spravim nieco takisto :/
Dalo by sa to brat ako splnenie ulohy ???

package tovaren.na.cokoladu;

public class Factory {

    /**
     * Tovaren na cukrovinky
     *
     * @param farba Farba cukrovinky
     * @param tvar Tvar cukrovinky
     * @param vaha Vaha cukrovinky
     * @return Farbu + tvar a vahu cukrovinky
     */
    public static String cukrovinky(String farba, String tvar, String vaha) {
        return farba + tvar + vaha;
    }

}
Odpovědět 22.2.2017 22:07
while (noSuccess) { tryAgain(); if (Dead) break;
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Peter Gasparik
vajkuba1234:23.2.2017 2:44

Vzor tovarna slouzi k vytvareni instanci, takze to nemas spravne.

Odpovědět 23.2.2017 2:44
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Peter Gasparik
vajkuba1234:23.2.2017 3:10
https://en.wikipedia.org/wiki/Factory_method_pattern
Odpovědět 23.2.2017 3:10
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Odpovědět 23.2.2017 8:00
while (noSuccess) { tryAgain(); if (Dead) break;
Avatar
Peter Gasparik:23.2.2017 13:30

Zdravím, s tou databázou to nemôže byť aj takto ?

public class Databaza {

    private Databaza()
    {

    }

    public static Databaza getInstance() {
        return new Databaza();

    }
    @Override
    public String toString() {
        return "MySql";
    }
}

potom mi to vypisuje pri tomto kóde a iný sa nedá vytvoriť

public class Main {

    public static void main(String[] args) {

        Databaza databaza = Databaza.getInstance();
        System.out.println(databaza);
    }
}

Ak je to zlé, tak prosím prečo ?

Odpovědět 23.2.2017 13:30
while (noSuccess) { tryAgain(); if (Dead) break;
Avatar
Abe
Člen
Avatar
Odpovídá na Peter Gasparik
Abe:26.2.2017 15:44

Tvé řešení je celkově takové nelogické z pohledu OOP, řekl bych, ale hlavní problém tvého řešení je, že při volání metody getInstance() pokaždé vytváříš novou instanci. Singleton ("jedináček") je o tom, že v celém programu máš pouze jednu instanci dané třídy. Tzn. že kdyby sis vytvořil proměnné databaza1 a databaza2, obě by obsahovaly reference na tutéž instanci databáze. V tvém programu vytváříš pokaždé novou instanci databáze, takže kdyby jsi ve třídě Databaza přidal i nějaké atributy, každé instanci (databaza1, databaza2) bys nastavil jiné hodnoty a zkusil bys je vypsat, viděl bys, že ty hodnoty má opravdu každá instance jiné. Cílem však je, aby, když změníš hodnotu v jakékoli proměnné typu Databaza, se změnila pro všechny tyto proměnné, protože, jak už jsem psal, jsou tyto proměnné pouze referencemi na jednu a tu samou instanci, která je v celém programu jen jedna.
Jsem začátečník, tak je možné, že jsem něco nenapsal správně, ale snad jsem to já pochopil správně a tobě se podaří pochopit to, co píšu. Kdyby ne, ptej se :).

 
Odpovědět 26.2.2017 15:44
Avatar
Peter Gasparik:27.2.2017 11:08

Áno, ďakujem, už som to pochopil.

Editováno 27.2.2017 11:08
Odpovědět 27.2.2017 11:08
while (noSuccess) { tryAgain(); if (Dead) break;
Avatar
Petr Brožek
Člen
Avatar
 
Odpovědět 16.6.2017 11:27
Avatar
Jaroslav Machovec:17. dubna 12:44

Zdravím, rád bych se zeptal na příklad s cukrovím. V metodě main se nachází cykly, vyrábějící instance cukroví. Avšak pokaždé se ta instance jmenuje stejně (cukrovi) ... Takže jestli dobře chápu referenční typy, tak se vlastně pokaždé vytvoří nová instance cukrovi, která se dosadí do proměnné cukrovi. Tudíž na instance cukroví, která jsme vytvořili předtím, už nám nic neukazuje, nemůžeme k nim už tedy přistupovat a sežere je garbage collector :-). Říkám to správně?

public static void main(String[] args) {
// Tvorba různých cukroví pomocí továrních metod
for (int i = 0; i < 5; i++)
{
Cukrovi cukrovi = TovarnaNaCukro­vi.vyrobBanano­ve();
System.out.prin­tln(cukrovi);
}
for (int i = 0; i < 8; i++)
{
Cukrovi cukrovi = TovarnaNaCukro­vi.vyrobJahodo­ve();
System.out.prin­tln(cukrovi);
}
for (int i = 0; i < 12; i++)
{
Cukrovi cukrovi = TovarnaNaCukro­vi.vyrobCokola­dove();
System.out.prin­tln(cukrovi);
}
}

 
Odpovědět 17. dubna 12:44
Avatar
Radka Jánská:27. dubna 23:47

Ahoj, ráda bych se připojila k otázce Jaroslava Machovce. Na výrobu jsem použila ještě trochu jiný kod:

for (int i = 0; i < 10; i++) {
System.out.prin­tln(pekarna.u­pecBananove());
}

Vyrobila jsem tímto způsobem 10 různých instancí? Jak mohu na těchto instancích volat metody apod. pokud nemají referenci / název? Např. co když chci první instanci smazat?

V případě, že vyráběné instance přiřazuji k proměnné cukrovi, jak to dělá Jaroslav, vyrobila jsem 10 instancí se stejným názvem? Co když chci tu první smazat?

Díky. R.

 
Odpovědět 27. dubna 23:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 19. Zobrazit vše