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.

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

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

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, 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í)

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á. Můžeme dokonce zkrátit její název Person.MAX_COUNT

Další příklady běžně používaných konstant

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

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

Inicializace nestatických 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