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, 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 — pro celou třídu nebo — jednotlivě po prvcích (metodách, atributech), nikoli jako v C++ po blocích prvků.
-
Omezení přístupu/viditelnosti je určeno uvedením jednoho z tzv. modifikátoru přístupu nebo naopak neuvedením žádného.
Přístup ke třídě vs. prvkům
-
Nastavení viditelnosti pomocí modifikátoru k celé třídě omezuje viditelnost příslušné třídy jako takové (vůbec možnost použití jejího názvu) i jejich statických vlastnosti (atributů, metod).
-
Dílčí vlastnosti uvnitř třídy pak mohou mát viditelnost stejnou nebo nižší.
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ě všechny) a některé metody. Veřejné jsou typicky metody předepsané implementovaným rozhraním.
-
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ě ze stejné třídy nebo její 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
. -
Nelze moc doporučit, 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 tak, že na jednom balíku pracuje jen jeden vývojář či skupina — 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 pro neveřejné třídy definované v jednom zdrojovém souboru se třídou veřejnou, když už to tak chceme psát.
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()
. -
Výhodou pak je, že skrýváme konkrétní implementaci datové položky, tzn. případně vůbec nemusí existovat jako proměnná, ale může se v případě potřeby (volání metody
get
) spočítat.
Použití private
- atributy
-
téměř vždy
private
kromě konstant, které chceme vidět odjinud, - metody
-
kromě těch nabízených veřejně je taky vhodné použít
private
,-
U metod trochu pozor, někdy je lepší nechat
protected
kvůli možnému překrývání v podtřídách. -
Je třeba rozmyslet dopředu, jak (zda vůbec) se bude třída moci dědit.
-
Volbou
private
nic zásadně nepokazíme, případně lze při pozdějších modifikacích změnit naprotected
.
-
Shrnutí viditelnosti
-
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 tříd (lokálních v balíku).