Upozornění pro čtenáře a uživatele této knihy
Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována ani šířena v papírové, elektronické či jiné podobě bez předchozího písemného souhlasu nakladatele. Neoprávněné užití této knihy bude trestně stíháno.

Rudolf Pecinovský

Java 9 – JShell
Edice pro netrpělivé

Vydala Grada Publishing a.s.
U Průhonu 22, Praha 7

Redakce: Jaroslava Palasová
Návrh vnitřního layoutu: Rudolf Pecinovský
Zlom: Rudolf Pecinovský
Formát ePub: Štěpán Böhm
Počet stran 163
První vydání, Praha 2017

Copyright © Grada Publishing, a.s., 2017

V knize použité názvy mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků.

ISBN 978-80-271-9786-6 (ePub)
ISBN 978-80-271-9785-9 (pdf)

Ing. Rudolf Pecinovský, CSc. je absolventem Fakulty Elektrotechnické ČVUT z roku 1979. Titul CSc. získal v Ústavu teorie informace a automatizace ČSAV v roce 1983. Od počátku 80. let učí a publikuje, přičemž svůj výzkum soustředí především na oblast vstupních kurzů moderního programování pro naprosté začátečníky. V současné době učí na Fakultě informatiky a statistiky Vysoké školy ekonomické v Praze, na Fakultě jaderné a fyzikálně inženýrské ČVUT a na Vysoké škole podnikání a práva. Doposud mu vyšlo přes 50 knih, které byly přeloženy do pěti jazyků. Většina jeho knih je zaměřena na výuku moderního programování a na umění návrhu objektově orientované architektury.

Všem, kteří se chtějí něco naučiti

Seznam programů

Výpis 1.1: Odezva prostředí JShell po spuštění

Výpis 1.2: Reakce prostředí na zadání výrazu

Výpis 1.3: Odezva prostředí na zadání dalších výrazů

Výpis 2.1: Definice proměnné pozdrav a její použití

Výpis 2.2: Definice proměnné pozdrav2 a její použití

Výpis 2.3: Deklarace neinicializovaných proměnných

Výpis 2.4: Pokus o deklaraci konstanty

Výpis 2.5: Definice výrazu rozepsaná na více řádcích

Výpis 2.6: Definice metody currentFile() vracející aktuální složku (adresář)

Výpis 2.7: Demonstrace zpracování syntaktických chyb

Výpis 2.8: Demonstrace zpracování dopředného odkazu

Výpis 3.1: Odpověď programu po zadání příkazu /list

Výpis 3.2: Použití příkazu /list k zobrazení vybraných výpisků

Výpis 3.3: Použití příkazu /list k zobrazení startovní sady úryvků

Výpis 3.4: Odpověď programu po zadání příkazu /list -all

Výpis 3.5: Odpověď programu po zadání příkazu /list -history

Výpis 3.6: Vypsání zadaných úryvků

Výpis 3.7: Odpověď programu po zadání příkazu /vars

Výpis 3.8: Odpověď programu po zadání příkazu /methods

Výpis 3.9: Odpověď programu po zadání příkazu /types

Výpis 3.10: Definice datového typu a jeho použití

Výpis 3.11: Odpověď programu po zadání příkazu /imports

Výpis 3.12: Definice potřebného importu při vkládání úryvku

Výpis 3.13: Dodatečná definici potřebného importu

Výpis 3.14: Seznam aktivních úryvků na konci kapitoly

Výpis 3.15: Výsledný seznam zadaných importů

Výpis 4.1: Obsah souboru uloženého v tomto okamžiku příkazem /save -history 04.1_Save_Hist.jsh

Výpis 4.2: Obsah interního skriptu DEFAULT

Výpis 4.3: Obsah interního skriptu PRINTING

Výpis 4.4: Seance, jež uloží svoji historii do souboru 04.3_Reset_Hist.jsh

Výpis 4.5: Obsah souboru 04.3_Reset_Hist.jsh uloženého ve výpisu 4.4

Výpis 4.6: Demonstrace chování příkazů /reset a /reload

Výpis 4.7: Obsah souboru 04.4_Reload_Hist.jsh uloženého na konci výpisu 4.6

Výpis 4.8: Výpis, který je pokračováním výpisu 4.6, demonstruje chování programu po zadání příkazu /reload -restore

Výpis 4.9: Obsah souboru 04.5_Reload_Restore_Hist.jsh ukládaného na konci výpisu 4.8

Výpis 5.1: Nápověda, jak používat nápovědu

Výpis 5.2: Reakce prostředí na další tři po sobě jdoucí stisky klávesy <TAB>

Výpis 5.3: Postupné doplňování zadávaného příkazu /list s10 s2

Výpis 5.4: Postupné doplňování zadávaného příkazu /list s10 s2

Výpis 5.5: Doplňování dat a zobrazení programové dokumentace

Výpis 5.6: Akce předcházející ukázce chování prostředí při zpětném hledání

Výpis 5.7: Průběh zpětného hledání

Výpis 6.1: Opětné spuštění prvních dvou úryvků

Výpis 6.2: Začátek seznamu úryvků po vyloučení proměnné $1

Výpis 6.3: Reakce na použití neexistující proměnné

Výpis 6.4: Odpovědi programu po zadání příkazu /drop start() a následném spuštění úryvku 29

Výpis 6.5: Vypsání podoby odebraných, neaktivních úryvků

Výpis 6.6: Používání aktivních i vyloučených úryvků

Výpis 6.7: Odpovědi programu po zadání příkazu /drop

Výpis 6.8: Vyloučení již vyloučeného úryvku

Výpis 7.1: Zjištění aktuálního nastavení

Výpis 7.2: Posloupnost příkazů zadávaná pro test reakcí v jednotlivých zpětnovazebních režimech a uložená v souboru 07.2_Test.jsh

Výpis 7.3: Reakce na příkazy z výpisu 7.2 v podrobném režimu

Výpis 7.4: Reakce na příkazy z výpisu 7.2 ve standardním režimu

Výpis 7.5: Reakce na příkazy z výpisu 7.2 ve stručném režimu

Výpis 7.6: Reakce na příkazy z výpisu 7.2 v tichém režimu

Výpis 7.7: Vliv parametru -retain na nastavení zpětnovazebního režimu

Výpis 7.8: Vliv parametru -retain na nastavení zpětnovazebního režimu

Výpis 7.9: Nastavování startovního skriptu

Výpis 7.10: Nastavování proměnné classpath

Výpis 8.1: Reakce prostředí na úpravy v zabudovaném editoru

Výpis 8.2: Pokračování výpisu 8.1 zobrazující přípravné operace

Výpis 8.3: Upravená definice (druhá verze) třídy Demo

Výpis 8.4: Pokračování výpisu 8.2 zobrazující problémy po redefinici třídy Demo

Výpis 8.5: Pokračování výpisu 8.4 demonstrující mé analytické kroky

Výpis 8.6: Pokračování výpisu 8.5 demonstrující experimenty s instancemi původní i opravené verze třídy Demo

Výpis 8.7: Použití editoru WordPad

Výpis 8.8: Použití editoru jEdit

Výpis 8.9: Použití editoru PSPad

Výpis 9.1: Definice metody main ve třídě ExampleJShell

Výpis 9.2: Definice metody processSnippetEvent(SnippetEvent)ve třídě ExampleJShell

Výpis 9.3: Definice metody evaluateStatus(SnippetEvent, StringBuilder) ve třídě ExampleJShell

Výpis 9.4: Obsah souboru 09.3_Test.jsh se zadávanými testovacími texty

Výpis 9.5: Úvodní část seance demonstrující zpracování jednoduchých výrazů

Výpis 9.6: Část demonstrující definici metod s dopřednými odkazy

Výpis 9.7: Část demonstrující definici metod s dopřednými odkazy v signatuře

Výpis 9.8: Část demonstrující změnu definice používaného datového typu

Výpis 9.9: Část demonstrující změnu definice používaného datového typu

Výpis 9.10: Závěrečná část se souhrnným výpisem definovaných úryvků

Seznam obrázků

Obrázek 3.1: Syntaktický diagram příkazu /list

Obrázek 3.2: Syntaktický diagram příkazu /vars

Obrázek 3.3: Syntaktický diagram příkazu /methods

Obrázek 3.4: Syntaktický diagram příkazu /types

Obrázek 3.5: Dialogové okno otevřené úryvkem

Obrázek 4.1: Syntaktický diagram příkazu /save

Obrázek 4.2: Syntaktický diagram příkazu /open

Obrázek 4.3: Syntaktický diagram příkazu /reload

Obrázek 5.1: Syntaktický diagram příkazu pro získání nápovědy

Obrázek 6.1: Syntaktický diagram příkazu /drop

Obrázek 7.1: Syntaktický diagram příkazu /set feedback pro nastavení zpětnovazebního režimu

Obrázek 7.2: Syntaktický diagram příkazu /set start pro nastavení startovního skriptu

Obrázek 8.1: Syntaktický diagram příkazu /edit

Obrázek 8.2: Okno zabudovaného editoru otevřené po zadání příkazu /edit

Obrázek 8.3: Definice třídy Demo v editačním okně

Obrázek 8.4: Syntaktický diagram příkazu /set editor

Obrázek 9.1: Závislosti mezi hlavními třídami balíčku jdk.jshell

Obrázek A.1 Okno otevřené ve Windows 10 po žádosti o vlastnosti složky Tento počítač

Obrázek A.2 Okno Vlastnosti systému

Obrázek A.3 Okno Proměnné prostředí ve Windows 10

Obrázek A.4 Okno Proměnné prostředí ve Windows 7

Obrázek A.5 Okno Upravit proměnné prostředí ve Windows 10

Obrázek A.6 Okno Úpravy systémové prostředí ve Windows 7

Obrázek A.7: Místní nabídka po puštění souboru přesouvaného pravým tlačítkem myši

Obrázek A.8: Dialogové okno pro nastavení vlastností zadaného zástupce

Obrázek A.9: Místní nabídka po puštění souboru přesouvaného pravým tlačítkem myši

Úvod

Otevíráte první ze série knih, které se vás pokusí seznámit s nejvýraznějšími novinkami nové verze jazyka Java, aniž by vás rozptylovaly výkladem základních programových konstrukcí.

Tato kniha se soustředí na výklad nového nástroje, kterým je program JShell. Tento program je reakcí na volání programátorů a učitelů programování, kterým v základní sadě nástrojů platformy Java chyběl program určený pro práci v režimu označovaném zkratkou REPL (Read-Evaluate-Print-Loop).

Příští díl se bude věnovat zavedení modulárního systému označovaného zkratkou JPMS (Java Platform Modular System) a z toho vyplývající úpravy a rozšíření základní sady nástrojů. V případě zájmu přibude i díl probírající ostatní novinky určené většinou zkušenějším programátorům.

Komu je kniha určena

Nástroj JShell je zaměřen na dvě skupiny uživatelů:

•Na programátory, kteří si potřebují rychle a jednoduše vyzkoušet nějaký nový nápad.

•Na učitele programování, kteří chtějí jednoduše demonstrovat studentům přednášenou látku a vlastnosti probírané programové konstrukce.

Tomu odpovídá i zaměření knihy. U obou skupin lze předpokládat, že znají jak programovací jazyk Java, tak stejnojmennou platformu a chtějí se seznámit s hlavními novinkami deváté verze jazyka a platformy Java. V knize proto nebudu vysvětlovat všeobecně známé konstrukce a knihovny, ale soustředím se na co nejlepší výklad práce s probíraným nástrojem. Na druhou stranu však nebudu předpokládat žádné hluboké znalosti programování ani hlubší znalosti práce s operačním systémem, takže by knihu měl být schopen číst i začínající programátor – absolvent základního kurzu programování.

Dohodněme se, že budu předpokládat programátorské znalosti na úrovni své knihy Java 8 – Úvod do objektové architektury pro mírně pokročilé (Pecinovský, 2014).

Terminologie

Nové termíny vysvětlím, až na ně narazím v textu. Tady bych chtěl pouze upozornit na termíny běžně používané, které se však v různých kurzech vysvětlují různě, takže při jejich interpretaci může občas dojít k nedorozumění.

Objekt × Instance

Prvním z nich je obecně známý termín objekt. Objektově orientované programování (OOP) říká, že „objekt je vše, co můžeme označit podstatným jménem“. Objektem jsou tedy i datové typy, metody a další součásti programu. Řada programátorů ale omezuje své chápání tohoto termínu na objekty, které jsou instancemi nějaké třídy. Toto chápání je důsledek kompromisů, které provedli autoři některých programovacích jazyků pro zvýšení efektivity vytvořených programů.

V čistém OOP implementovaném např. v jazyku Smalltalk je však objektem cokoliv. V tomto významu budu tento termín dále používat. Budu-li chtít hovořit o objektech, které jsou instancemi nějaké třídy, budu vždy hovořit o instancích.

O programu JShell, kterému je věnována tato kniha, bychom mohli říci, že ke všem objektům přistupuje z jistého hlediska stejně a je mu jedno, zda se právě jedná o instanci nějakého typu, příkaz, metodu nebo datový typ. Připravte se proto na to, že budu-li v textu hovořit o objektech, budu mít na mysli libovolný druh objektu.

Rozhraní × interfejs

Termínem rozhraní (přesněji rozhraní objektu) označuji souhrn vlastností a schopností, které daný objekt zveřejňuje a jeho okolí je může využívat při komunikaci s daným objektem.

Termínem interfejs pak budu označovat programovou konstrukci, která měla původně reprezentovat rozhraní datových typů, ale v osmé verzi Javy přibrala i omezené možnosti definice implementace.

Textový podpis

Budu-li někde hovořit o textovém podpisu instance (případně jenom o podpisu instance), budu tím mít na mysli textový řetězec obdržený po zavolání metody toString().

Syntaktické definice a diagramy

Pro definice možných způsobů zápisu nějakého příkazu se používají syntaktické definice a/nebo syntaktické diagramy. Syntaktické definice jsou výhodnější pro strojové zpracování, ale syntaktické diagramy jsou pochopitelnější pro člověka. V učebnicích se sice syntaktické diagramy příliš neobjevují, ale to je většinou pouze důsledek nechuti autorů k tvorbě obrázků. V této knize jim ale budu dávat přednost.

Syntaktický diagram ukazuje, jak je možno zobrazovanou konstrukci zapsat. Pojedete-li po čarách, tak jakýkoliv průjezd generuje syntakticky správnou konstrukci. Toho, kdo syntaktické diagramy ještě nezná a chtěl by rychle některý vidět, bych odkázal např. na diagram na obrázku 3.1 na straně 42.

Potřebné vybavení

Nechcete-li si knížkou pouze listovat, ale chcete-li ji použít jako příručku či dokonce učebnici, budete si jistě chtít vše vyzkoušet. K tomu potřebujete vhodný vývojový nástroj. Pro studium této knihy bude s výjimkou poslední kapitoly stačit pouhé JDK. Pro experimentování s programem probíraným v poslední kapitole je vhodné instalovat IDE podporující Javu 9.

Vývojová sada JDK 9

Pro úspěšné studium této knihy budete potřebovat mít instalovanou Javu 9. Tu stáhnete ze stránky http://www.oracle.com/technetwork/java/javase/downloads/.

Patříte-li mezi ty opravdu netrpělivé, kteří si chtějí vše vyzkoušet ještě před tím, než bude uvolněna oficiální verze (firma Oracle plánuje její uvedení na 21. září 2017), musíte si stáhnout předběžnou verzi označovanou jako Early Access. Odkaz na ni najdete na téže stránce, jenom musíte popojet kousek níž a stisknout tlačítko Download v sekci Early Access Releases.

Vývojové prostředí

Teoreticky už nic dalšího nepotřebujete, nicméně většina programátorů používá nějaký profesionální vývojový nástroj. Je zcela na vás, jaký nástroj zvolíte. Já jsem při vývoji výukových nástrojů používal vývojové prostředí NetBeans, protože ta ostatní nenabízejí potřebnou nestandardní funkcionalitu. Jsou totiž optimalizována pro profesionální programátory, kteří tyto nestandardní funkce nepotřebují.

Opět si ale budete muset zkontrolovat, že daná verze podporuje Javu 9. Očekávám, že ostré verze podporující Javu 9 se objeví až na přelomu roku 2017 a 2018. Budete-li si proto chtít vyzkoušet vše dříve, budete muset použít vývojovou verzi daného prostředí. Podrobnosti se dozvíte na stránce výrobce.

Pro tři nejrozšířenější vývojová prostředí, tj. pro prostředí NetBeans, IntelliJ IDEA a Eclipse se pokusím sledovat poslední změny a informovat o nich na stránce knihy na adrese http://knihy.pecinovsky.cz/53_java9_jshell. Psát o nich zde nepovažuji vhledem k častým změnám za vhodné.

Doprovodné programy

Všechny doprovodné programy zmiňované a používané v textu najdete na stránce knihy na adrese http://knihy.pecinovsky.cz/53_java9_jshell. Měli byste zde najít soubory 53_Java9_JShell_VVVV.zip, což je archiv obsahující dvě virtuální složky:

•Složku JShell se záznamy seancí spolu se soubory ukládanými v průběhu výkladu. Na tyto soubory se bude v každé kapitole odkazovat její závěrečná podkapitola nazvaná Soubory pro opakování.

•Složku Lib obsahující dvě knihovny, které začneme používat v podkapitole 7.4 Nastavení proměnné classpath na straně 100. V této složce jsou dva soubory:

• Soubor js.Win_Class.jar obsahující jednoduchou demonstrační knihovnu s třídou js.Win.

•Soubor N56-Lib-en_Framework.jar s jednoduchým frameworkem, který používám ve svých začátečnických učebnicích. Zájemci o její zdrojový kód najdou příslušný odkaz na stránce knihy.

Použité typografické konvence

K tomu, abyste se v textu lépe vyznali a také abyste si vykládanou látku lépe zapamatovali, používám několik prostředků pro odlišení a zvýraznění textu.

Termíny

První výskyt nějakého termínu a další texty, které chci zvýraznit, vysazuji tučně.

Název

Názvy firem a jejich produktů vysazuji kurzivou. Kurzivou vysazuji také názvy kapitol, podkapitol a oddílů, na které se v textu odkazuji.

Citace

Texty, které si můžete přečíst na displeji, např. názvy polí v dialogových oknech či názvy příkazů v nabídkách, vysazuji tučným bezpatkovým písmem.

Program

Identifikátory a další části programů zmíněné v běžném textu vysazuji neproporcionálním písmem, které je v elektronických verzích pro zvýraznění tmavě červené.

metoda(?)

Při odkazech na metody budu v závorkách za názvem metody vždy uvádět seznam typů jejich parametrů – např. equals(Object). Nebude-li v danou chvíli jasné, jaké má zmiňovaná metoda parametry, budu do závorek psát otazník – např. metoda(?).

úryvek

Tučně červeně bude ve výpisech konverzace se systémem vypisován text zadaný uživatelem. Text zapsaný systémem bude vypsán černě.

<Klávesa>

Modře, kapitálkami a ve špičatých závorkách budou vysazovány klávesové zkratky. Ve výpisech budou označovat místa, kde uživatel danou klávesovou zkratku stiskl. Má-li se klávesa stisknout při stisknutém přeřaďovači, bude tento přeřaďovač uveden v závorkách spolu s klávesou – např. <Shift+Tab>.

Kromě výše zmíněných částí textu najdete v knize ještě řadu doplňujících poznámek a vysvětlivek. Všechny budou v jednotném rámečku, který bude označen ikonou charakterizující druh informace, kterou vám chce poznámka či vysvětlivka předat.

Symbol jing-jang bude uvozovat poznámky, s nimiž se setkáte na počátku každé kapitoly. Zde vám vždy prozradím, co se v dané kapitole naučíte.

Otevřená schránka s dopisy označuje informace o projektu, s nímž budeme v dalším textu pracovat, nebo v něm najdete vzorové řešení aplikující probranou látku. Příslušný projekt získáte pomocí generátoru projektů popsaného výše.

Obrázek knihy označuje poznámku týkající se používané terminologie. Tato poznámka většinou upozorňuje na další používané termíny označující stejnou skutečnost nebo na konvence, které se k probírané problematice vztahují.

Píšící ruka označuje obyčejnou poznámku, která pouze doplňuje informace z hlavního proudu výkladu o nějakou zajímavost.

Ruka s hrozícím prstem upozorňuje na věci, které byste měli určitě vědět a na které byste si měli dát pozor, protože jejich zanedbání vás většinou dostane do problémů.

Usměváček vás bude upozorňovat na různé tipy, kterými můžete vylepšit svůj program nebo zefektivnit svoji práci.

Mračoun vás naopak bude upozorňovat na různá úskalí programovacího jazyka nebo programů, s nimiž budeme pracovat. Bude vám radit, jak se těmto nástrahám vyhnout či jak to zařídit, aby vám alespoň pokud možno nevadily.

Brýle označují tzv. „poznámky pro šťouraly“, ve kterých se vás snažím seznámit s některými zajímavými vlastnostmi probírané konstrukce nebo upozorňuji na některé souvislosti. Jejich znalost však není k pochopení látky nezbytná.

Zpětná vazba

Kniha vznikla na základě přání řady mých studentů a programátorů z mých kurzů. Vznikala poměrně narychlo, takže lze očekávat, že se v ní může vyskytnout větší množství chyb, protože ve zrychleném režimu procházela i redakcí. Objevíte-li proto v knize nějakou chybu nebo budete mít návrh na nějaké její vylepšení, neostýchejte se napsat na adresu rudolf@pecinovsky.cz. Pokusím se co nejdříve zanést na stránku knihy příslušná errata s opravou, kterou pak zapracujeme do případného dalšího vydání.

Pokud vám bude někde připadat text nepříliš srozumitelný nebo budete mít nějaký dotaz, ať už k vykládané látce či použitému vývojovému prostředí, pošlete mail s předmětem ADVENT_DOTAZ. Bude-li se dotaz týkat něčeho obecnějšího, zveřejním na stránce knihy http://knihy.pecinovsky.cz/53_java9_jshell odpověď i pro ostatní, které by mohl obdobný dotaz napadnout za pár dní, anebo jsou natolik ostýchaví, že se netroufnou sami zeptat.

Kapitola 1

Seznamte se: JShell

Co se vkapitole naučíte

Tato kapitola vám vysvětlí, co to jsou prostředí typu REPL, aseznámí vás sprogramem aprostředím JShell, které je od 9. verze integrální součástí Javy. Naučí vás, jak upravit konfiguraci svého systému tak, aby bylo možno program JShell snadno spustit, ana příkladu několika jednoduchých příkazů vám ukáže, jak sním pracovat.

1.1Prostředí typu REPL

(3 + 5) * 7

1.2Příprava testovací složky (adresáře)

1.3Příprava programu JShell aprvní spuštění

První spuštění

jshell -v

Zveřejnění cesty kprogramu

1.4Spuštění aukončení programu

4

5jshell>

1.5Úryvky (snippets) apříkazy (commands)

1.6První úryvky

1jshell> (3 + 5) * 7

1.7Pomocné proměnné (scratch variables)

1.8Soubory pro opakování