Druhá kapitola našeho seriálu o výuce objektově orientovaného programování se pomalu chýlí ke konci. V příštím pokračování nás již čeká jen závěrečné shrnutí.
2.16 Konstanty a literály
V programech často používáme nejrůznější „magické hodnoty“, které se v průběhu programu nemění. Budeme-li chtít např. pracovat s počtem dnů v týdnu, budeme neustále používat číslo 7. Problém nastane, když se při některé z pozdějších úprav rozhodneme, že místo počtu dnů v celém týdnu bude pro náš program výhodnější používat pouze počet pracovních dnů, tj. 5 (alespoň prozatím to tak je). Taková úprava pak znamená prolézt celý program a všechny sedmičky nahradit pětkami.
Již samotná tato představa je dostatečně nepříjemná. Noční můrou se ale stane, pokud je program opravdu rozsáhlý a navíc je v něm řada různých „sedmiček“ – některé sedmičky budou např. znamenat, že v červenci začínají prázdniny, a další sedmičky budou oznamovat, že pracujeme od 7 hodin ráno.
Rozumní programátoři proto takovéto magické hodnoty zásadně nepoužívají a dávají přednost pojmenovaným konstantám. Ty se v Javě definují stejně jako proměnné, pouze se mezi jejich modifikátory uvede klíčové slovo final.
Konstantám můžeme přiřadit hodnotu pouze jednou a již nikdy ji nemůžeme změnit:
- statickým konstantám přiřadíme jejich hodnotu hned v deklaraci,
- nestatickým konstantám, které nemají svoji hodnotu přiřazenou v deklaraci, musíme přiřadit hodnotu v konstruktoru.
Terminologická poznámka: Tyto „magické hodnoty“ se označují jako literály. Literál je konstanta zapsaná svojí hodnotou – např. 7 (celočíselný literál), "Ahoj" (řetězcový literál) apod. Naproti tomu konstanty, o nichž jsme právě hovořili, se označují jako pojmenované konstanty, protože ve své definici dostanou jméno, kterým se na ně v programu odvoláváme. Budu-li v dalším textu hovořit o konstantách, budu tím vždy myslet pojmenované konstanty. Pokud bych chtěl hovořit o literálech, vždy to výslovně uvedu. Poznámka o dobrých mravech: Obdobně řetězcové literály je vhodné používat pouze v situacích, kdy se daný řetězec použije pouze jednou (např. v chybovém hlášení). Chcete-li však program lokalizovat do více jazyků, je vhodné i jednou použité textové řetězce pojmenovat a definovat všechny na jednom místě, kde je lze snadno nahradit jejich překlady. |
Rozšiřme počet konstruktorů smrku o konstruktor, který umožní zadat i jeho barvu. Definujme přitom konstantu BARVA_0, v níž bude uchována implicitní barva smrku, kterou použijeme ve chvíli, kdy nebude jeho barva zadána. Počátek programu s příslušnou konstantou a konstruktory by mohl vypadat následovně (dokumentační komentáře a dříve definované metody a atributy pro úsporu místa opět vynechávám):
public class Smrk { //== VEREJNE KONSTANTY ========================================================= public static final String BARVA_0 = "zelena"; // … preskoceno … //== KONSTRUKTORY ============================================================== public Smrk( int x, int y, int s, int v, String b ) { horni = new Trojuhelnik( x+s/5, y, 3*s/5, 3*v/7, b ); stredni=new Trojuhelnik( x+s/10, y+v/7, 4*s/5, 4*v/7, b ); dolni = new Trojuhelnik( x, y+2*v/7, s, 5*v/7, b ); }//public Smrk( int x, int y, int sirka, int vyska, String Barva ) public Smrk( int x, int y, int sirka, int vyska ) { this( x, y, 50, 70, BARVA_0 ); }//public Smrk( int x, int y, int sirka, int vyska ) // … preskoceno … }// public class Smrk
Jak jste si jistě všimli, definoval jsem konstantu jako veřejnou. Když jsme se bavili o zapouzdření, říkal jsem, že atributy mají být soukromé a že veřejné mohou být pouze konstanty, které nikdo nemůže změnit. Nyní ten případ nastal. Protože se domnívám, že konstantu BARVA_0 může okolí za jistých okolností využít, definoval jsem ji jako veřejnou.
Poznámka: |
Úkol:
Doplňte do třídy Smrk2 konstantu BARVA_0 spolu s metodami getBarva() a setBarva(String).
Rudolf Pecinovský
0 komentářů:
Okomentovat