JE_Obsah
- 1. Úvod
- Úvod
- 2. Vytváření a rušení objektů
Tato kapitola se zabývá vytvářením a rušením (odstraňováním) objektů: kdy a jak objekty vytvářet, kdy a jak se jejich vytváření vyhýbat, jak zajistit zrušení objektů ve vhodném okamžiku a jak organizovat veškeré čistící práce, které musejí předcházet zrušení nějakého objektu.
- Rada 1: Zvažte posyktnutí statických továrních metod namísto konstruktorů
- Rada 2: Pomocí soukromého konstruktoru zajistěte vlastnost jedináčka
- Rada 3: Pomocí soukromého konstruktoru zajistěte nemožnost vytvoření instance
- Rada 4: Vyhýbejte se vytváření duplicitních objektů
- Rada 5: Odstraňte zastaralé odkazy na objekty
- Rada 6: Vyhýbejte se finalizátorům
- 3. Metody společné všem objektům
Třebaže je Object konkrétní třída, je určena především k rozšiřování. Všechny její nefinální metody (equals, hashCode, toString, clone a finalize) mají explicitní obecné kontrakty, protože jsou určené k překrytí. Je zodpovědností každé třídy, překrývající tyto metody, podrobit se jejich obecným kontraktům; pokud se tak nestane, nebudou moci další třídy závisející na těchto kontraktech správně fungovat ve spojení s danou třídou.
Tato kapitola vám osvětlí, kdy a jak přepisovat nefinální metody třídy Object. Metoda finalize je v této kapitole vynechána, protože byla popsána v radě 6. Třebaže se nejedná o metodu třídy Object, najdete v této kapitole popis metody Comparable.compareTo, protože má podobný charakter.
- Rada 7: Při překrývání equals se podrobte obecnému kontraktu
- Rada 8: Když překrýváte equals, vždy překryjte také hashCode
- Rada 9: Vždy překrývejte toString
- Rada 10: Přepisujte clone s rozvahou
- Rada 11: Zvažte implementování Comparable
- 4. Třídy a rozhraní
Třídy a rozhraní leží v srdci programovacího jazyka Java. Jsou jeho základními jednotkami abstrakce. Jazyk poskytuje mnoho silných prvků, které můžete používat k vytváření tříd a rozhraní. Tato kapitola obsahuje zásady, které vám pomohou nejlépe využít všech těchto prvků, aby byly ve výsledku vaše třídy a rozhraní použitelná, robustní a flexibilní.
- Rada 12: Minimalizujte přístupnost tříd a členů
- Rada 13: Dávejte přednost neměnitelnosti
- Rada 14: Dávejte přednost kompozici před dědičností
- Rada 15: Dědění navrhněte a zdokumentujte, nebo je zakažte
- Rada 16: Dávjete přednost rozhraním před abstraktními třídami
- Rada 17: Používejte rozhraní pouze k definování typů
- Rada 18: Dávejte přednost statickým továrním třídám před nestatickými
- 5. Náhrady konstrukcí jazyka C
Programovací jazyk Java má mnoho společného s programovacím jazykem C, několik konstrukcí jazyka C však bylo vypuštěno. Ve většině případů je jasné, proč byla nějaká konstrukce vypuštěna a jak se lze bez ní obejít. Tato kapitola představuje několik konstrukcí jazyka C, jejichž náhrady nejsou tak zřejmé.
Společným příznakem všech rad v této kapitole je skutečnost, že všechny vypuštěné konstrukce jsou orientované na data a nikoli na objekty. Programovací jazyk Jav nabízí silný typový systém a navrhované náhrady plně tento typový systém využívají. Nabízejí tak abstrakce vyšší kvality, než jimi nahrazované konstrukce jazyka C.
Rozhodnete-li se tuto kapitolu přeskočit, přečtěte si alespoň radu 21, která popisuje vzor typově zabezpečeného výčtu, jenž je náhradou konstrukce enum jazyka C. Tento vzor není zatím dostatečne známý a přitom nabízí několik výhod oproti metodám, jež se v současné době používají.
- Rada 19: Nahrazujte struktury třídami
- Rada 20: Nahrazujte sjednocení hierarchiemi tříd
- Rada 21: Nahrazujte konstrukce enum třídami
- Rada 22: Nahrazujte ukazatele na funkce třídami a rozhraními
- 6. Metody
Tato kapitola pojednává o několika aspektech návrhu metod: jak pracovat s parametry a návratovými hodnotami, jak navrhovat podpisy metod a jak metody dokumentovat. Většina materiálu z této kapitoly platí nejen pro metody, ale také pro konstruktory. Stejně jako kapitola 4 se tato kapitola soustřeďuje na použitelnost, robustnost a flexibilitu.
- Rada 23: Kontrolujte platnost parametrů
- Rada 24: Vytvářejte defenzivní kopie, když jsou zapotřebí
- Rada 25: Pečlivě navrhujte podpisy metod
- Rada 26: Buďte soudní při používání přetěžování
- Rada 27: Vracejte pole nulové délky a nikoli hodnoty null
- Rada 28: Ke všem vystaveným prvkům API napište dokumentační komentáře
- 7. Obecné programování
Tato kapitola se věnuje převážně různým obecným prvkům jazyka. Popisuje práci s lokálními proměnnými, používání knihoven, používání různých datových typů a práci se dvěma mimojazykovými nástroji: reflexí a nativními metodami. Nakonec pojednává rovněž a optimalizaci a konvencích vytváření názvů.
- Rada 29: Minimalizujte obor platnosti lokálních proměnných
- Rada 30: Znejte a používejte knihovny
- Rada 31: Vyhýbejte se typům float a double, pokud požadujete přesné odpovědi
- Rada 32: Nepoužívejte řetězce tam, kde jsou vhodnější jiné typy
- Rada 33: Dávejte si pozor na výkonnost spojování řetězců
- Rada 34: Odkazujte se na objekty jejich rozhraními
- Rada 35: Dávejte přednost rozhraním před reflexí
- Rada 36: Používejte nativní metody soudně
- Rada 37: Optimalizujte rozumně
- Rada 38: Držte se obecně přijatých konvencí vytváření názvů
- 8. Výjimky
Když jsou používány dobře, moho výjimky zlepšit čitelnost, spolehlivost a spravovatelnost programu. Při nevhodném používání mohou mít přesně opačný účinek. Tato kapitola nabízí pokyny zajišťující efektivní používání výjimek.
- Rada 39: Používejte výjimky pouze pro výjimečné podmínky
- Rada 40: Používejte kontrolované výjimky u zotavitelných stavů a výjimky za běhu
- Rada 41: Vyhýbejte se zbytečnému používání kontrolovaných výjimek
- Rada 42: Dávejte přednost použití standardních výjimek
- Rada 43: Vyvolávejte výjimky odpovídající dané abstrakci
- Rada 44: Dokumentujte všechny výjimky vyvolávané každou metodou
- Rada 45: Do podrobných zpráv zahrňte informace o zachycení selhání
- Rada 46: Snažte se dosáhnout atomičnosti selhání
- Rada 47: Neignorujte výjimky
- 9. Vlákna
Vlákna (toky) umožňují vykonávat souběžně několik činností v témže programu. Vícevláknové programování je obtížnější než programování s jedním vláknem, takže zde více než jinde platí zásada z rady 30: Existuje-li nějaká knihovna, která vás oprostí od vícevláknového proramování na nízké úrovni, pak ji rozhodně použijte. Jedním příkladem je třída java.util.Timer a celou kolekcí nástrojů práce s vláky na vysoké úrovni je pak balíček Dougha Ley util.concurrent [Lea01]. I když použijete takové knihovny všude tam, kde je to možné, přesto budete muset občas napsat nebo spravovat nějaký vícevláknový kód. Tato kapitola obsahuje rady, které vám pomohou vytvářet jasné, správné a dobře dokumentované vícevláknové programy.
- Rada 48: Synchronizujte přístup ke sdíleným měnitelným datům
- Rada 49: Vyhýbejte se přílišnému synchronizování
- Rada 50: Nikdy nevolejte wait mimo smyčku
- Rada 51: Nespoléhejte na plánovače vláken
- Rada 52: Dokumentujte zabezpečení vláken
- Rada 53: Vyhýbejte se skupinám vláken
- 10. Serializace
Tato kapitola se zabývá rozhraním API serializace objektů, které poskytuje rámec pro kódování objektů do bajtových toků a rekonstruování objektů z bajtových toků. Kódování objektu jako bajtového toku se označuje za serializaci objektu; opačný proces za jeho deserializaci. Jakmile je nějaký objekt serializovaný, lze jeho zkódování přenést z jednoho běžícího virtuálního počítače na jiný nebo uložit na disk a později jej deserializovat. Serializace nabízí standardní reprezentaci objektů na úrovni určené pro vzdálenou komunikaci a standardní stálý datový formát pro komponentní architekturu JavaBeans.
- Rada 54: Implementujte Serializable uvážlivě
- Rada 55: Zvažte použití vlastní serializované formy
- Rada 56: Pište metody readObject defenzivně
- Rada 57: Je-li to zapotřebí, poskytněte metodu readResolve