Java 8
Úvod do objektové architektury pro mírně pokročilé

Obálka 2. dílu

Naposledy aktualizováno:   
2015-02-10 – 20:40:53

Zpět na přehled knih.

Obsah

Soubory ke stažení

Generátor doprovodných programů

Generátor projektů je v souboru UOA-2_Java8_v8.05.5199_2015-02-10.jar.
V názvu souboru je vždy je uvedeno číslo verze doplněné datem jejího vzniku.
Počáteční osmička říká, že se jedná o doprovodné programy ke knize o Javě 8,
další dvojčíslí pak specifikuje podverzi,
následující čtyřčíslí označuje interní číslo verze v mém správci verzí
a na závěr názvu je uvedeno datum vzniku daného souboru.

Pokud vám nebude ve vašich programech něco fungovat, podívejte se sem,
jestli na podobný problém nenarazil už někdo před vámi
a jestli proto není k dispozici novější verze.

Spuštění generátoru

Balík doprovodných programů je uložen jako samorozbalovací archiv,
který je naprogramován v jazyku Java, takže vyžaduje,
abyste již měli na svém počítači Javu instalovánu.
Další podmínky na vás neklade.

Archiv spustíte obdobně jako jiné programy,
tj. povětšinou poklepáním na příslušný soubor.
Po jeho spuštění se otevře dialogové okno (viz obrázek),
v němž zadáte vše potřebné a spustíte generaci požadovaných doprovodných programů.

Máte-li na počítači instalovaný nějaký (většinou komprimační) program,
který se prohlásí za "vlastníka" JAR-souborů,
nemusí vám dovolit spustit JAR-soubor poklepáním.
Bude-li proto váš počítač trucovat a bude odmítat JAR-soubor jednoduše spustit,
zkuste program spustit z příkazového řádku zadáním příkazu:

  java -jar <cesta-k-Jar-souboru>

V některých operačních systémech, např. ve Windows,
nemusíte dokonce ani zadávat celou cestu k souboru,
ale stačí pouze přetáhnout soubor do okna příkazového řádku
a systém cestu na konec aktuálního příkazového řádku sám doplní.

Ovládání generátoru

Ovládání generátoru je jednoduché. Po spuštění souboru se otevře dialogové okno,
v němž do vstupního pole Cílová složka: zadáte cílovou složku,
do které se mají vygenerované projekty ukládat (složka musí existovat).
Nemáte-li odkud její adresu zkopírovat a nechce-li se vám vypisovat,
můžete stisknout tlačítko Procházet ...
a složku najít, resp. vytvořit prostřednictvím dialogového okna.

Pod vstupním polem je seznam s názvy projektů, které je možno vygenerovat.
Projekty vybíráte klepnutím myši. Chcete-li jich vybrat více,
můžete využít přeřaďovačů CTRL a SHIFT, které zde fungují standardně.
Chcete-li vybrat všechny projekty, stačí pod seznamem stisknout tlačítko
Generovat všechny.

Po zadání cílové složky a seznamu generovaných projektů
stiskněte tlačítko OK
a během chvilky se v zadané cílové složce požadované projekty objeví.

NetBeans 8 – Nastavení konfigurace

V učebnici vám ukazuji, jak můžete převzít moji konfiguraci NetBeans.
Nastaveními pro prostředí NetBeans, o němž se hovoří ve druhé kapitole,
je v souboru NBSetting_UOA2_J8_v8.0.2.5164_2015-01-18_RUP.zip.
 

Plugin pro bezpečné zavření NetBeans

Zásuvný modul (plugin) vyžadující vaše potvrzení před zavřením programu
a bránící tak nechtěnému zavření (a hlavně zdlouhavému následnému otevírání) IDE
při nechtěném stisku zavíracího tlačítka nebo nějaké jiného příkazu zavírajícího celou aplikaci
je uložen v souboru close_verification.nbm.

Opravy nalezených chyb (errata)

Přes veškeré kontroly se do knihy vloudilo pár chybiček.
Zde jsou opravy těch, na něž jsem přišel já nebo čtenáři
(většinu z nich objevil Rostislav Bodorik, kterému za to velmi děkuji). Důvodem některých nepřesných popisů je také fakt, že od vydání knihy vyšlo několik inovovaných
verzí prostředí NetBeans, a v nich se některé příkazy a nastavení zadávají trochu jinak.

Pasáže, které budou v následujících opravách vysazeny kurzivou, mají pouze vysvětlující charakter,
a nejsou určeny k vyhledání v textu či k náhradě původního textu.


Strana 85, 1. odstavec odspodu, 2. řádek odspodu
V knize:
manager
Správně:
canvasmanager

Strana 89, 4. odstavec odspodu, 3. řádek odspodu
V knize (a ve starších verzích NetBeans):
zadáním příkazu Window → Other → Javadoc
Správně: (přesněji v novějších verzích NetBeans):
zadáním příkazu Window → IDE Tools → Javadoc documentation

Strana 98, 3. odstavec odspodu, 1. řádek
V knize (a ve starších verzích NetBeans):
povel Ant Libraries
Správně: (přesněji v novějších verzích NetBeans):
povel Libraries

Strana 105, 3. odstavec, 1. řádek
V knize (a ve starších verzích NetBeans):
Napište písmeno O. Seznam se změní na delší
Správně: (přesněji v novějších verzích NetBeans):
Když jsem knihu psal, fungovalo to tak, jak je v ní popsáno.
V současných verzích se seznam prodlouží a nabídne položku JOptionPane
až při napsání třetího písmene.

Strana 105, před 4. odstavec odspodu
V knize:
V knize jsem zapomněl upozornit na nutnost explicitního ukončení programu
při používání oken.
Správně: Přidejte na konec seznamu bod:
  1. Jakmile začnete pracovat s okny, musíte se postarat o korektní ukončení běhu programu,
    protože jinak program stále čeká, až po něm budete něco chtít. Nejjednodušší bývá
    vložit do místa, kde má program skončit, příkaz:
    System.exit(0);
    Přidejte jej proto na konec těla vytvářené metody.
Opraveno:
Generátor doprovodných programů od verze 8.02.5186.

Strana 124, 3. odstavec odspodu, 3. řádek
V knize:
nechcete spouštět.
Správně:
nechcete spouštět (nezapomeňte doplnit příkaz import org.junit.Ignore;).

Strana 132, 4. odstavec odspodu, 2. řádek odspodu
V knize:
Odvez
Správně:
testOperation

Strana 141, 4. odstavec, 3. řádek
V knize:
Odkomentujte proto závěrečnou část zdrojového souboru s hlavní a testovací metodou a zadejte
Správně:
Zakomentovanou šablonu testovací a hlavní metody jsem dával na konec definice třídy
v dobách, kdy bylo vytváření testovacích tříd a spouštění testů trošku složitější.
Předchozí věty proto nyní neplatí a místo nich bychom nyní mohli napsat:

Přesuňte se proto na konec zdrojového kódu a vložte před zavírací´závorku těla třídy
prázdný řádek, do kterého napíšete zkratku psvm (zkratka z public static void main).
(Objeví-li se po napsání celé zkratky nějaká nabídka tříd, stikněte Esc, čímž ji smažete.)
Stiskněte tabulátor, a na místo kurzoru se vloží definice prázdné hlavní metody.
(Máte-li novější verzi konfigurace, vloží se i s příslušnými řádkovými komentáři.)
Zadejte

a nyní už bude následovat původní text:

ve vlastnostech projektu nově vytvořenou třídu jako hlavní třídu projektu
(probírali jsme to v podkapitole 4.5 Zadání spouštěcí třídy projektu na straně 105).

Strana 143, za poslední řádek
V knize:
Chybí explicitní ukončení programu.
Správně: Přidat řádek
System.exit(0)
Opraveno:
Generátor doprovodných programů od verze 8.02.5186.

Strana 152, 3. odstavec odspodu
V knize:
Správně:
Já jsem nastavení tohoto varování vypnul, a vypnuté je i ve stahované importované
konfiguraci. Nepoužité parametry jsou většinou ty, které po nás vyžaduje přebíjená
metoda, i když jej v přebíjecí metodě vůbec nepoužijeme. Používáte-li proto
importovanou konfiguraci, toto varování se neobjeví.

Strana 153, 3. odstavec odspodu, 1. řádek
V knize:
getInstance()
Správně:
getStep()

Strana 156, výpis 6.2
V knize:
Nevím, jak se to podařilo, ale do výpisu 6.2 se vloudily chybičky.
Když navíc v zájmu sjednocení odebereme modifikátory final z deklarací proměnných
m2 a m4 (předpokládáme, že v takto krátké metodě si je dokážeme ohlídat),
bude mít výpis tvar:
Správně:
public Vehicle(int column, int row, NamedColor bodyColor,
                                    NamedColor arrowColor)
{
    int m1 = CM.getStep();
    int x  = m1 * column;
    int y  = m1 * row;
    int m2 = m1 / 2;
    int m4 = m1 / 4;
    Rectangle back    = new Rectangle(x,    y,    m2, m1, NamedColor.RED);
    Ellipse   nose    = new Ellipse  (x,    y,    m1, m1, NamedColor.RED);
    Rectangle arrBody = new Rectangle(x,    y+m4, m2, m2, NamedColor.BLACK);
    Triangle  arrHead = new Triangle (x+m2, y,    m2, m1, NamedColor.BLACK,
                                                          Direction8.EAST);
    body = new Multishape(back, nose, arrHead, arrBody);
}

Strana 170, výpis 7.2, řádky 9+10
V knize:
Další chybička ve výpisu – v knize je uvedeno:
/** Zpravodaj zprostředkující odsazovaný tisk na standardní výstup.
private static final IndentingReporter IR;
>
Správně:
V komentáři chybí zavírací závorka a navíc hodnota atributu nemůže být konstanta,
protože se nastavuje až v metodě setUpClass().
V programu jsem to již dávno opravil, ale přehlédl jsem, že je to i v knize.
Deklarace atributu IR má proto být až v sekci statických proměnných a má vypadat:
 
/** Zpravodaj zprostředkující odsazovaný tisk na standardní výstup. */
private static IndentingReporter IR;

Jde ale jen o text knihy. V doprovodných programech by ale mělo být vše správně.

Strana 181, 3. odstavec, poslední 3 řádky
V knize:
(Ve výpisu 7.5 jsem do něj sice jeden příkaz vložil, ale to jenom proto,
abyste si mohli ve výsledku ověřit funkci odsazování a přisazování.)
Správně:
Tato metoda nakonec při závěrečném zlomu z knihy vypadla (nebylo pro ni místo).
V doprovodných programech ji ale samozřejmě najdete i s oním vloženým příkazem.

Strana 244, 3. řádek zdola
V knize:
getDirection() vrátí směr, do něhož je vozidlo právě natočeno.
Správně:
Tento řádek je tu navíc.
O metodě getDirection() se zde zmiňuji předčasně,
protože ji zavedeme až v kapitole 13.5 na straně 294.
Opraveno:
Generátor doprovodných programů od verze 8.05.5???.

Strana 255, výpis 11.3, řádek 127
V knize:
Na konci výpisu chybí definice metody toString()
Správně:
Definici metody si můžete najít v projektu – tam nevypadla.

Strana 271, výpis 12.9
V knize:
public Ring(Position startField, int length, NamedColor color)
{
    firstSegment    = new SegmentEast(position, length, color);
    multishape.addTheShape(firstSegment);
}
Správně:
public Ring(IRingSegment startSegment, Multishape multishape)
{
    this.startSegment = startSegment;
    this.multishape   = multishape;
}

Strana 273, výpis 12.10
V knize:
public void startWith(IRingBuildSegment startSegment)
Správně:
public RingBuilder startWith(IRingBuildSegment startSegment)

Strana 274, odstavec 4, řádek 2 zdola
V knize:
Jak uvidíte v testu (výpis 12.19 na straně 282),
Správně:
Jak uvidíte v testu (výpis 12.13 na straně 275),

Strana 274, výpis 12.11
V knize:
public IRingBuildSegment appendRight(int length)
Správně:
public RingBuilder appendRight(int length)

Strana 292, Odstavec 2. zdola, řádek 1
V knize:
(v obrázku 13.2 na řádku 155),
Správně:
(v obrázku 13.2 na řádku 9),

Strana 294, 5. odstavec zdola
V knize:
v našem případě speed,
Správně:
v našem případě size,


Nejčastější dotazy (FAQ)

Tato sekce je určena pro odpovědi na vaše nejčastější dotazy.

Na počátku jsou dotazy, které se netýkají přímo vykládané látky,
ale jsou zaměřeny na některé související záležitosti:
instalaci JDK, NetBeans, konfiguračního doplňku a doprovodných programů,
některé vlastnosti NetBeans, apod.

Za nimi jsou pak dotazy k textu knihy.
Ty jsem seřadil podle stránek, na nichž se nachází text,
při jehož studiu se objevily nejasnosti.

Budete-li mít nějaký dotaz, ať už k látce či prostředí, pošlete mi
mail s předmětem začínajícím UOA2_J8_Dotaz:
Bude-li se dotaz týkat něčeho obecnějšího,
zveřejním zde odpověď i pro ty ostatní.



Dotaz:
Po načtení projektů NetBeans hlásí, že jsou v nich chyby.

Odpověď:
Problémy některých z vás by mohly zapříčiněny tím,
že máte vedle Javy 8, kterou se chcete prostřednictvím knihy naučit,
instalovány i starší verze Javy a vaše NetBeans
nepovažují Javu 8 za implicitní verzi používané platformy.
Doprovodné programy pak sice budou dál provozovatelné,
ale bude třeba upravit jejich vlastnosti a vysvětlit jim,
že používají jinou platformu, než tu implicitní.
Bude-li někdo chtít podrobněji vysvětlit, jako se to dělá
napište.

Pokud NetBeans hlásí chyby až u projektů pro kapitolu 6 a další,
mohla by být chyba v tom, že máte špatně instalovanou knihovnu CanvasManager.


Dotaz:
Při spouštění projektů NetBeans hlásí, že nemohou najít hlavní třídu,
přestože tato třída existuje a překladač ji bez problému přeložil.

Odpověď:
U některých verzí NetBeans nefunguje dokonale automatický překlad ukládaných souborů.
Překladač je sice úspěšně uloží, ale NetBeans si tuto skutečnost špatně zapamatují.
Otevřete proto okno s vlastnostmi projektu
(viz kapitolu 3.9 Vlastnosti projektu, strana 97, obrázek 3.14)
v něm otevřete stránku Compiling a na ní zrušte zaškrtnutí políčka Compile on Save.


Dotaz:
Když podle popisu v pasáži Vynechání konkrétního testu na straně 124
odkomentuji anotaci @Ignore, program ochláší chybu:

error: cannot find symbol
    @Ignore
    symbol:   class Ignore
    location: class ElevatorTest

Odpověď:
Když použijete jakýkoliv nový datový typ z jiného balíčku,
musíte uvést jeho plný název, anebo jej importovat.
To platí i pro anotace, které jsou pouze zvláštním druhem interfejsů.


Dotaz:
Třída Robot je implementací interfejsu IVehicle, který je potomkom interfejsu IModular.
To implementují i třídy RobotEast, atd. protože implementují interfejs IRobot1, jenž je jeho potomkem .
Když má ale stavová část objektu plnit pouze ty funkce, které jsou závislé na změně stavu,
tak by se v ní ale nic takového nevyskytovat němělo.
V našem případě by např. metoda getModule() měla být ve třídě Robot a ne ve třídě RobotEast, atď.
Takto musí třída Robot vědět o implementačních detailech svého stavu.
Jak by sa to mělo správne navrhnouť?

Odpověď:
Otočný robot (a obecněji vozidlo) musí být schopen prozradit a nastavit svoji pozici a velikost.
Nejjednodušším řešením je v našem případě to, že tuto povinnost deleguje na svůj aktuální jednostavový podobjekt.
Aby toho byl tento podobjekt schopen, nezbývá nám, než jej definovat jako instanci potomka interfejsu IModular.

Obecně neplatí, že jednostavový objekt má definovat pouze stavově závislé funkce.
Má za úkol definovat stavově závislé chování, a k tomu občas potřebuje umět i takové věci,
které samy o sobě se změnou stavu bezprostředně nesouvisejí.