JE - Úvod

Cílem této knihy je umožnit vám co nejefektivněji používat programovací jazyk Java a jeho základní knihovny java.lang, java.util a v menší míře také java.io. Kniha se občas zmiňuje i o dalších knihovnách, nezabývá se však programováním grafického uživatelského rozhraní ani podnikovými rozhraními API.

Kniha se skládá z 57 rad; každá z nich uvádí jedno pravidlo. Tato pravidla obecně považují za přínosná ti nejlepší a nejzkušenější programátoři. Rady jsou volně seskupeny do devíti kapitol, z nichž každá se zabývá jedním širším aspektem návrhu softwaru. Knihu nemusíte číst od začátku postupně až do konce: každá z rad je víceméně samostatná. V textu se často vyskytují odakzy na další rady, takže si můžete vytvořit svou vlastní cestu obsahem knihy.

Většinu rad ilustrují příklady programů. Klíčovým prvkem této knihy je to, že obsahuje příklady kódu ilustrující mnoho návrhových vzorů a idiomů. Některé jsou staré, např. jedináček (rada 2), a jiné jsou nové, např. strážce finalizátoru (rada 6) a defenzivní metoda readResolve (rada 57). Je-li to možné, jsou u takových vzorů uvedeny odkazy na standardní referenční díla této oblasti [Gamma95].

Mnoho rad obsahuje jednu nebo více ukázek programů ilustrujících postupy, kterým byste se měli vyhýbat. Takové příklady, označované někdy za antivzory, jsou jasně vyznačeny podobným komentářem: "// Tohle nikdy nedělejte!". V každém případě daná rada vysvětluje, co je na příkladu špatného, nabízí aletrnativní přístup.

Tato kniha není pro začátečníky: předpokládá, že programovací jazyk Java již dobře znáte. Pokud ne, prostudujte si některý ze základních textů [Arnold00, Campione00]. Knihu sice může využívat kdokoli s pracovní znalostí jazyka, poskytuje však myšlenkový materiál i pro pokročilé programátory.

Většina z pravidel v této knize vychází z několika základních principů. Obrovský význam má jasnost a jednoduchost. Uživatel nějakého modulu by nikdy neměl být překvapen jeho chováním. Moduly by měly být tak malé, jak je to jen možné, nikoli však menší (termín modul, jak je používaný v této knize, představuje jakoukoli opakovaně použitelnou softwarovou komponentu od jediné metody až po složitý systém skládající se z několika balíčků). Kód by měl být opakovaně používán a nikoli kopírován. Závislosti mezi moduly musejí být minimální. Chyby musejí být po vzniku zaregistrovány co nejdříve, nejlépe během kompilace.

Třebaže pravidla uvedená v této knize nemohou platit ve 100 procentech případů, ve velké většině případů charakterizují ty nejlepší programovací postupy. Uvedená pravidla nemusíte naplňovat otrocky, ale porušovat byste je měli jen občas a z dobrého důvodu. Učení se programovacímu jazyku, stejně jako většině dalších disciplín, se skládá z poznání pravidel a následného pochopení, kdy je lze porušit.

Tato kniha není z větší části o výkonnosti. Je o psaní programů, které jsou jasné, správné, použitelné, robustní, flexibilní a spravovatelné. Pokud dokážete toto všechno, pak je obvykle již relativně jednoduché dosáhnout požadované výkonnosti (rada 37). Některé rady sice popisují otázky výkonnosti a několik jich dokonce nabízí určité hodnoty reálného výkonu. Tyto hodnoty, které jsou uvedeny frází "na mém počítači", je však zapotřebí považovat pouze za odhady.

Pokud se jedná o můj počítač, je to doma postavený stroj s procesorem Pentium II na 400 Mhz a 128 megabajty paměti RAM, na němž běží verze 1.3 jazyka Java 2 Standard Edition Software Development Kit (SDK) společnosti Sun pod systémem Microsoft Windows NT 4.0. Tato sada SDK zahrnuje Java HotSpot Client VM společnosti Sun, což je velmi dobrá implementace JVM určená pro klientské použití.

Při popisu prvků programovacího jazyka Java a jeho knihoven je občas zapotřebí zmínit se o konkrétních verzích. Kvůli stručnosti používá tato kniha "čísla technických verzí" namísto názvů oficiálních verzí. Tabulka 1.1 zachycuje spojitost mezi názvy vydaných verzí a technickými čísly verzí.

Oficiální název verze Číslo technické verze
JDK 1.1.x / JRE 1.1.x 1.1
Java 2 Platform, Standard Edition, verze 1.2 1.2
Java 2 Platform, Standard Edition, verze 1.3 1.3
Java 2 Platform, Standard Edition, verze 1.4 1.4

Třebaže jsou v některých radách popsány prvky zavedené ve verzi 1.4, ukázky programů tyto prvky až na velmi málo výjimek nepoužívají. Příklady byly otestovány na verzi 1.3. Většina z nich, pokud ne dokonce všechny, by měla bez úprav fungovat i ve verzi 1.2.

Příklady jsou rozumně ucelené, dávají však přednost čitelnosti před úplností. Volně používají třídy z balíčků java.util a java.io. Chcete-li si příklady zkompilovat, může být zapotřebí zadat jeden z následujících příkazů importu (nebo oba dva):

import java.util.*;
import java.io.*;

Podobně jsou vypuštěny i další obecné věci. Webové stránky této knihy jsou na internetové adrese http://java.sun.com/docs/books/effective a obsahují rozšířenou verzi každého z příkladů, kterou si můžete zkompilovat a spustit.

Z větší části používá tato kniha technické termíny tak, jak jsou definované v materiálu The Java Language Specification, Second Edition [JLS]. Několik termínů si však zasluhuje zvláštní zmínku. Jazyk podporuje čtyři druhy typů: rozhraní, třídy, pole a primitivní hodnoty. První tři se označují za referenční typy. Instance tříd a pole jsou objekty; primitivní typy nejsou. Členové třídy sestávají ze svých atributů, metod, členských tříd a členských rozhraní. Podpis metody sestává z jejího hlavního názvu a typů jejích formálních parametrů; podpis nezahrnuje návratový typ metody.

Tato kniha používá několik termínů odlišně od specifikace The Java Language Specification. Narozdíl od tohoto dokumentu používá tato kniha termín dědičnost jako synonymum vytváření podtříd. Místo používání termínu dědění u rozhraní tato kniha prostě říká, že určitá třída implementuje nějaké rozhraní nebo že jedno rozhraní rozšiřuje druhé. K označení úrovně přístupu, který je platný, není-li žádný zadán, používám popisný termín přátelský (či soukromý pro balíček) namísto technicky korektního termínu výchozí přístup [JLS, 6.6.1].

Kniha rovněž používá několik technických temínů, které nejsou v dokumentu The Java Language Specification definovány. Termín exportované API nebo prostě API představuje třídy, rozhraní, konstruktory, členy a serializované formy, kterými programátor přistupuje ke třídě, rozhraní nebo balíčku (termínu API, což je zkratka aplikačního programovacího rozhraní, se dává přednost před jinak lepším termínem rozhraní, aby nedocházelo k záměně se stejnojmennou konstrukcí jazyka - interface). Programátor píšící program, který využívá nějaké API, se označuje za uživatele daného API. Třída, jejíž implementace používá nějaké API, je klientem daného API.

Třídy, rozhraní, konstruktory, členové a serializované formy se společně označují za prvky (elementy) API. Exportované API se skládá z prvků API, které jsou přístupné mimo balíček, jenž dané API definuje. Jedná se o ty prvky API, které může používat každý klient a k jejichž podpoře se autor daného API zavazuje. Není náhodou, že jsou to také prvky, pro něž je nástroj Javadoc generuje ve svém výchozím režimu dokumentaci. Volně řečeno, exportované API balíčku se skládá z veřejných a chráněných členů a konstruktorů každé veřejné třídy nebo rozhraní v balíčku.

Tato kniha používá termín podtřída ve významu dceřinné neboli podřízené třídy v hierarchii tříd. Podobně termín nadtřída označuje jakoukoli rodičovskou neboli nadřízenou třídu. Místo zde používaného překladu předběžná podmínka se můžete setkat také s termínem vstupní podmínka. Stejně tak platí zaměnitelnost termínů následná podmínka a výstupní podmínka.