package cz.muni.fi.pb162;
// class Person is in this package
public class Person {
// attributes, methods
}
Tomáš Pitner, Radek Ošlejšek, Marek Šabo, Jakub Čecháček pitner@muni.cz
Při správném objektovém návrhu se snažíme dělat malé třídy s jasně vymezenou zodpovědností (single responsibility principle).
Velký projekt se proto skládá z velkého množství tříd (souborů).
Proto třídy organizujeme do hierarchických balíků.
V jednom balíku jsou vždy umístěny související třídy.
pracuje na nich jeden tým
jejich objekty spolupracují
jsou podobné úrovni abstrakce
jsou ze stejné části reality
Aby se zabránilo kolizím (stejná jména pro různé třídy).
Konstruují se jména balíků jako pokud možno světově unikátní.
Byla zvolena obdoba doménových internetových jmen (taky unikátní).
cz.muni.fi.pb162
je možné a vhodné jméno balíku
je světově unikátní, protože cz.muni.fi
je obrácené doménové jméno fakulty (fi.muni.cz
)
pb162
je identifikátor, jehož jedinečnost už si v rámci organizace FI "uhlídáme"
Pozor, jiné konvence mají balíky ve standardní vestavěné knihovně Java Core API (např. java.util
)
Občas jsou výjimky i jinde, např. používalo se junit.framework
, i když to nebylo Java Core API.
Přesun souboru .java
do příslušného podadresáře.
Deklarace balíku ve zdrojovém kódu třídy (obvykle jako první deklarace v zdrojovém souboru).
Neuvedeme-li se příslušnost k balíku, stane se třída součástí tzv. implicitního balíku — nepoužívat!
package cz.muni.fi.pb162;
// class Person is in this package
public class Person {
// attributes, methods
}
Všechna písmena názvu balíku by měla být dle konvencí malá, tedy nikoli Cz.Muni.Fi.PB162 nebo tak něco. |
Na třídu v balíku se odvoláváme plným názvem, např. cz.muni.fi.pb162.Person
.
Pokud se odvoláváme na třídu ve stejném balíku (z jedné do druhé), pak stačí jen "holé" lokální jméno Person
.
Pokud importujeme balík, ve kterém je třída umístěna, pak lze opět použít pouze "holé" lokální jméno Person
.
Píšeme obvykle ihned po deklaraci příslušnosti k balíku (package názevbalíku;
).
Pozn.: Import není nutné deklarovat mezi třídami téhož balíku!
package cz.muni.fi.pb162.banking;
import cz.muni.fi.pb162.Person;
public class Account {
private Person owner; // class name imported above
}
Import všech tříd z balíku provedeme mocí "wildcard", např. import cz.muni.fi.pb162.*;
Doporučuje se "import s hvězdičkou" nepoužívat vůbec
jestli máme více *
importů, a obojí z nich obsahují třídu Person
, která z nich se použije?
(nepoužije se žádná, dostanete kompilační chybu)
Přestože řadíme balíky hierarchicky, nadbalík a podbalík jsou vždy vnímány jako nezávislé balíky.
Např. import cz.muni.fi.*
zpřístupní třídy z balíku cz.muni.fi
, ale nikoliv třídu cz.muni.fi.pb162.Person
.
Viditelnost:
- Pokud není u třídy, metody, nebo atributu uvedena viditelnost (public
, private
nebo protected
), definujete tzv. "package visibility", tj. prvek (třída, metoda, atribut) jsou dostupné kódu tříd umístěných ve stejném balíku.
- Opět platí, že podbalík / nadbalík jsou vnímány jako různé balíky.
- Tuto viditelnost nepoužívejte, protože v živém projektu se třídy a balíky často reorganizují.