Viditelnost (práva přístupu)

Tomáš Pitner, Radek Ošlejšek, Marek Šabo
tomp@fi.muni.cz

Základní principy OOP

  • Dědičnost umožňuje vztah X is Y (X je Y) mezi objekty.

    • Umožňuje rozšířit již existující třídu, tedy vytvořit její podtřídu (podtyp), která od svého rodiče zdědí jeho atributy a metody
    • Proč? Znovupoužití kódu.

  • Polymorfismus je schopnost objektu měnit chování počas běhu.

    • Object o = new String("String, but can be Object").
    • Na místo, kde je očekávána instance třídy Object, je možné dosadit instanci jakékoli její podtřídy. Odkazovaný objekt se chová podle toho, jaké třídy je instancí.

  • Zapouzdření je zabalení dat a metod do jedné komponenty (třídy), souvisí s viditelností objektů.

    • Cokoli, co nemusí být viditelné, nemá být viditelné.
    • Proč? Vede ke skrývání dat, informací.

Viditelnost

  • Použití tříd i jejich metod a atributů lze regulovat (uvedením tzv. modifikátoru přístupu).
  • Nastavením správné viditelnosti jsme schopni docílit zapouzdření.
  • Omezení viditelnosti je kontrolováno při překladu → není-li přístup povolen, nelze program přeložit.
  • Metody i atributy uvnitř třídy mohou mít viditelnost stejnou jako třída nebo nižší.

Typy viditelnosti / přístupu

Existují čtyři možnosti:

  • public = veřejný
  • protected = chráněný
  • modifikátor neuveden = říká se privátní v balíku (package-private)
  • private = soukromý

Tabulka viditelností

Table 1. Access Levels table
Modifier Class Package Subclass (diff. package) World

public

Y

Y

Y

Y

protected

Y

Y

Y

N

no modifier

Y

Y

N

N

private

Y

N

N

N

  • např. atribut typu private je viditelný pouze v rámci dané třídy
Třídy nemohou být protected!

Použití typů viditelnosti v tomto kurzu

public

třídy/rozhraní, metody, konstanty

private

atributy, metody, konstanty

protected

pravděpobně nebudeme používat, výjimečně metody, atributy

package-private

pravděpobně nebudeme používat

Veřejný, public

  • Přístupné odevšad.
public class Account { ... }
  • U třídy Account lze např.

    • vytvořit objekt typu Account v metodě jiné třídy
    • deklarovat podtřídu třídy Account ve stejném i jiném balíku

  • ne všechny vlastnosti uvnitř Account musejí vždy být veřejné
  • veřejné bývají obvykle některé konstruktory a některé metody
  • veřejné jsou typicky metody předepsané implementovaným rozhraním
  • třídy deklarované jako veřejné musí být umístěné do souboru s totožným názvem: Account.java

Soukromý, private

  • Viditelné jen v rámci třídy.
public class Account {
   private String owner;
   ...
   public void add(Account another) {
     another.owner; // can be accessed!
     ...
   }
}
  • K atributu owner nelze přistoupit v podtřídě, pouze v dané třídě.
  • Pro zpřístupnění proměnné pro "vnější" potřeby je nutno použít gettery/settery.
  • Skrýváme konkrétní implementaci datové položky.
  • Např. metoda getAge() nemusí existovat jako proměnná, ale může se v případě volání spočítat.
Volbou private nic zásadně nepokazíme.

Soukromé třídy

Třídy mohou mít viditelnost private.

Proč by někdo chtěl privátní třídu?

public class SomeClass {
  private class InnerDataStructure { ... }
  // code using InnerDataStructure
}
  • Používá se u vnořených tříd (tříd uvnitř tříd).
  • Mimo rozsah předmětu, nebudeme používat!
Ve stejném souboru může být libovolný počet deklarací neveřejných tříd. Není to však hezké.

Lokální v balíku, package-private

  • Přístupné jen ze tříd stejného balíku, používá se málo.
  • Jsou-li podtřídy v jiném balíku, třída není přístupná!
package cz.some.pkg;

class Account {
// package-private class
// available only in cz.some.pkg
}
  • Svazuje viditelnost s organizací do balíků (ta se může měnit častěji než např. vztah nadtřída-podtřída).
  • Občasné využití, když nechceme mít konstruktor private nebo rozhraní public.

Chráněný, protected

  • Viditelnost protected , tj. přístupné jen z podtříd a tříd stejného balíku.
public class Account {
   // attribute can be protected (but it is better to have it private)
   protected float creditLimit;
}
  • U metod tam, kde se nutně očekává použití z podtříd nebo překrývání.
  • Vcelku často u konstruktorů — často se volá právě ze stejné (pod)třídy.

Shrnutí viditelnosti

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

metoda
  • obvykle public, je-li užitečná i mimo třídu či balík
  • protected je-li je vhodná k překrytí v případných podtřídách
  • jinak private
atribut
  • obvykle private
  • výjimečně protected, je-li potřeba přímý přístup v podtřídě
třída
  • obvykle public
  • výjimečně package-private nebo private

/