Viditelnost

  • Přístup ke třídám i jejim prvkům lze (podobně jako např. v C++) regulovat.

  • Přístupem se rozumí jakékoli použití dané třídy, prvku… prostě už vůbec výskyt daného identifikátorů tím může být omezen.

  • Omezení přístupu/viditelnosti je kontrolováno hned při překladu → není-li přístup povolen, nelze program ani přeložit.

  • Tímto způsobem lze regulovat přístup/viditelnosti staticky, mezi celými třídami, nikoli pro jednotlivé objekty!

  • Jiný způsob zabezpečení představuje tzv. security manager, který lze aktivovat při spuštění JVM.

Granularita viditelnosti/omezení přístupu

  • Přístup/viditelnost je v Javě regulován/a jednotlivě po prvcích (metoda, atribut),

  • nikoli jako v C++ po blocích.

  • Omezení přístupu/viditelnosti je určeno uvedením jednoho z tzv. modifikátoru přístupu (access modifier) nebo naopak neuvedením žádného.

Typy omezení viditelnosti/přístupu

Existují čtyři možnosti:

  • public = veřejný

  • protected = chráněný

  • modifikátor neuveden = říká se lokální v balíku nebo chráněný v balíku evt. "přátelský"

  • private = soukromý

Kde jsou která omezení aplikovatelná?

Třídy mohou být:

veřejné

public

neveřejné

lokální v balíku

Vlastnosti tříd = atributy a metody mohou být:

veřejné

public

chráněné

protected

neveřejné

lokální v balíku

soukromé

private

public

  • Viditelnost public , přístupné odevšad

    public class Account {
       ...
    }
  • Třída Account je veřejná, tj. lze např.

  • vytvořit objekt typu Account i v metodě jiné třídy;

  • deklarovat podtřídu třídy Account ve stejném i jiném balíku.

  • Ovšem ne všechny vlastnosti uvnitř Account musejí být veřejné (ale mohou).

Použití public

  • Veřejné bývají obvykle některé konstruktory (nikoli nezbytně) a některé metody.

  • Atributy téměř nikdy, jedině konstanty ano (nikoli nezbytně).

protected

  • Viditelnost protected , tj. přístupné jen z podtříd a ze tříd stejného balíku

    public class Account {
       // chráněná proměnná
       protected float creditLimit;
    }

Použití protected

  • Pro metody (občas) a atributy (málokdy).

  • U metod tam, kde se nutně očekává použití z podtříd nebo překrývání.

  • Vcelku často u konstruktorů, protože konstruktor se často volá právě z podtřídy.

Lokální v balíku

  • Viditelnost lokální v balíku = přátelský → přístupné jen ze tříd stejného balíku, už ale ne z podtříd, jsou-li v jiném balíku.

    public class Account {
       Date created; // proměnná lokální v balíku
    }

Použití "lokálního v balíku"

  • používá se málo, a to spíše u proměnných než metod, ale dost často se vyskytuje z lenosti programátora, kterému se nechce psát protected či private.

  • osobně moc nedoporučuji, protože svazuje viditelnost/přístupová práva s organizací do balíků (→ a ta se může přece jen měnit častěji než např. vztah nadtřída-podtřída.)

  • Mohlo by mít význam, je-li práce rozdělena na více lidí na jednom balíku pracuje jen jeden člověk — pak si může přátelským přístupem chránit své neveřejné prvky/třídy → nesmí ovšem nikdo jiný chtít jeho třídy rozšiřovat a používat přitom přátelské prvky.

  • Používá se ale relativně často pro neveřejné třídy definované v jednom zdrojovém souboru se třídou veřejnou.

private

  • Viditelnost private (soukromý), tj. viditelné/přístupné jen v rámci třídy, ani v podtřídách — používá se častěji pro proměnné než metody

  • Označením private prvek zneviditelníme i případným podtřídám.

    public class Account {
       private String owner;
       ...
    }
  • proměnná owner je soukromá = nelze k ní přímo přistoupit ani v podtřídě — je tedy třeba zpřístupnit proměnnou pro "vnější" potřeby jinak, např.

  • přístupovými metodami setOwner(String m) a String getOwner().

Použití private

atributy

téměř vždy (kromě konstant),

metody

kromě těch nabízených veřejně je taky vhodné použít, zde trochu pozor — někdy je lepší nechat protected kvůli možnému překrývání v podtřídách. Zde ale chce rozmyslet dopředu, jak (zda vůbec) se bude třída moci dědit. Volbou private proto nic zásadně nepokazíme.

Shrnutí viditelnosti

  • Nastavení viditelnosti k třídě pomocí modifikátorů na úrovni tříd shora pak omezuje viditelnost všech objektů příslušné třídy i její statických vlastnosti (atributů, metod) atd.

  • Dílčí vlastnosti pak mohou mát viditelnost stejnou nebo nižší.

  • Obvykle se řídíme následujícím:

    metoda

    by měla být public, je-li užitečná i mimo třídu či balík — "navenek", což je typické u metod předepsaných v rozhraní. Je metoda určená/vhodná k překrytí případných podtřídách? pak protected, jinak klidně private.

    atribut

    by měl být private a zcela výjimečně protected tehdy, je-li potřeba přímý přístup v podtřídě. Téměř nikdy bychom neměli deklarovat atributy jako public (vyjma případů, kdy jde o konstanty určené ke sdílení vně)!

Viditelnost a umístění deklarací do souborů

  • Třídy deklarované jako veřejné (public) musí být umístěné do souborů s názvem totožným s názvem třídy (a přípona .java) i na systémech Windows (vč. velikosti písmen).

  • Kromě takové třídy však může být v tomtéž souboru i libovolný počet deklarací neveřejných (package-local, "přátelských") tříd.