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šadpublic 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íkupublic 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
čiprivate
. -
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)
aString 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. Volbouprivate
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? pakprotected
, 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 jakopublic
(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.