Create a constant.py:
# declare constants
PI = 3.14
GRAVITY = 9.8
Tomáš Pitner, Radek Ošlejšek, Marek Šabo, Jakub Čecháček pitner@muni.cz
Konstanty slouží pro pojmenování určitých konkrétních hodnot se zvláštním významem v programu — tzv. magic numbers, kde nemusí být na první pohled zřejmé, proč je to zrovna právě ta hodnota.
Třeba static final int MAX_CAPACITY = 12
může znamenat konstantu,
která se může v dalších verzích programu zvětšit.
Konstanty v Javě jsou vždy umístěny v některé ze tříd či rozhraní - nemohou jen tak globálně "plavat nad vším".
Proto si ji rozumně pojmenujeme a pak používáme tento identifikátor místo přímé hodnoty.
Může jít i o objektové typy (např. konstanta typu Person
).
Všeobecně platí: raději víc konstant než míň. |
Create a constant.py:
# declare constants
PI = 3.14
GRAVITY = 9.8
Jmenná konvence (velká písmena) je stejná jako v Javě.
V Pythonu je to jen konvence, lze znovu přiřadit, tj. PI = 3.2
je technicky možné.
V Javě bráníme opakovanému přiřazení označením symbolu jako final
.
Konstanty jsou vždy:
static
)stačí nám jedna hodnota pro celou třídu, nemá smysl, aby každý objekt měl svou stejnou kopii.
final
)je to konstanta, tudíž pomocí final
zajistíme neměnnost
Konstanta může být:
private
, protected
pokud ji nechceme používat mimo třídu
public
pokud má širší použití (díky final
se nejedná o porušení zapouzdření)
public static final int MAX_PEOPLE_COUNT = 100;
public boolean maxPeopleCountReached() {
return peopleCount >= MAX_PEOPLE_COUNT;
}
int count = Person.MAX_PEOPLE_COUNT;
Všimněte si, že uvádíme i název třídy,
ve které je konstanta definovaná Person.MAX_PEOPLE_COUNT .
Je to sice delší, ale je to tak vlastně dobře: umístění
do tříd je zapouzdřením konstanty - hned vidíme, kam patří a co znamená.
Můžeme dokonce zkrátit její název Person.MAX_COUNT |
Třída Math
definuje běžné matematické konstanty, např. Math.PI
Objektové obálky primitivních typů definují speciální hodnoty,
např. Double.MAX_VALUE
, Double.POSITIVE_INFINITY
, nebo Double.NaN
.
final
Slovo final
způsobuje, že daná hodnota se v proměnné nemůže změnit.
V objektové proměnné je uložena adresa (odkaz),
final
odkaz se tedy změnit nemůže, ale vnitřek (atributy) objektu ano
Proto se může kombinovat s neměnnými (immutable) objekty, u nichž se vnitřek nemění
final
objektová proměnnáfinal int i = 1;
i = 2; // cannot be done
final Person p = new Person("Honza");
p = new Person("Pavel"); // cannot be done
p.setName("Pavel"); // dirty hack
final
atributůPřímo při jejich deklaraci (rovnou se nastaví hodnota jako u lokální proměnné)
V konstruktoru
Nelze obojí. Přesněji, do final
atributu lze zapsat jen jednou během vytváření objektu