Aký je rozdiel medzi public, protected, package-private a private v Jave?

Existujú v Jave jasné pravidlá, kedy používať jednotlivé modifikátory prístupu, konkrétne predvolený (package private), public, protected a private, pri vytváraní class a interface a pri práci s dedičnosťou?

Riešenie

Oficiálny návod vám môže byť užitočný.

______________________________________________________________
| │ Trieda │ Balík │ Podtrieda │ Podtrieda │ Svet |
| │ │ │ │(rovnaký pkg)│(rozdielny pkg)│ |
|───────────┼───────┼─────────┼──────────┼──────────┼────────|
|public │ + │ + │ + │ + │ + │ |
|───────────┼───────┼─────────┼──────────┼──────────┼────────|
|chránené │ + │ + │ + │ + │ |
|───────────┼───────┼─────────┼──────────┼──────────┼────────|
|bez modifikátora│ + │ + │ + │ │ |
|───────────┼───────┼─────────┼──────────┼──────────┼────────|
|súkromné │ + │ │ │ │ │ |
|___________|_______|_________|__________|__________|________|
 + : prístupné prázdne : neprístupné
Komentáre (19)

Jednoduché pravidlo. Začnite tým, že všetko vyhlásite za súkromné. A potom postupujte smerom k verejnému, ako to budú vyžadovať potreby a dizajn.

Pri odhaľovaní členov sa pýtajte, či odhaľujete voľby reprezentácie alebo voľby abstrakcie. Prvej možnosti sa chcete vyhnúť, pretože zavedie príliš veľa závislostí od skutočnej reprezentácie, a nie od jej pozorovateľného správania.

Vo všeobecnosti sa snažím vyhýbať prepisovaniu implementácií metód prostredníctvom podtried; je príliš jednoduché pokaziť logiku. Deklarovať abstraktné chránené metódy, ak máte v úmysle, aby boli prepisované.

Pri prepisovaní používajte aj anotáciu @Override, aby ste pri refaktorovaní veci nerozbili.

Komentáre (2)

Rozdiel nájdete v už uvedených odkazoch, ale to, ktorý z nich použiť, sa zvyčajne odvíja od princípu najmenších znalostí. Povoľte len tú najmenšiu viditeľnosť, ktorá je potrebná.

Komentáre (0)