Konstanty

Konstanty v Javě

  • 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.

Objekty — konstanty

  • Může jít i o objektové typy (např. konstanta typu Person).

  • Všeobecně platí: raději víc konstant než míň.

Pozor!
  • kde potřebujeme více konstantních hodnot stejného typu, třeba dny v týdnu MONDAYSUNDAY, je lepší než

  • public static final int MONDAY = 0public static final int SUNDAY = 6 použít výčtový typ (enum Weekdays { MONDAY, TUE …​ }).

Připomenutí: konstanty v Pythonu

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.

Definice konstanty

Konstanty jsou vždy
Statické

(static) stačí nám jedna hodnota pro celou třídu, nemá smysl, aby každý objekt měl svou stejnou kopii.

Neměnné

(final) je to konstanta, tudíž pomocí final zajistíme neměnnost

Konstanta může být
private

dobře možné, když ji nechceme používat mimo třídu

public

nicméně asi obvyklejší, většinou má širší použití

Příklad konstanty

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á. Proto bychom dokonce mohli zkrátit její název Person.MAX_COUNT a pořád by bylo jasno.

Vestavěné konstanty

Java Core API (standardní knihovny Javy) nabízí řadu hotových konstant, používejme je:

  • Třída Math definuje běžné matematické konstanty, např. Math.PI

  • Okrajové a speciální hodnoty pro všechny číselné typy, např. Double.MAX_VALUE, Double.POSITIVE_INFINITY, nebo Double.NaN.

Klíčové slovo 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í

Příklad 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