Organizace tříd do balíků
-
Třídy zorganizujeme do balíků.
-
V balíku jsou vždy umístěny související třídy.
-
Co znamená související?
-
pracuje na nich jeden tým
-
jejich objekty spolupracují
-
jsou podobné úrovni abstrakce
-
jsou ze stejné části reality
-
Příklad: V balíku geometry jsou třídy reprezentující geometrické objekty (čtverec, trojúhelník, …).
Světově unikátní pojmenování balíků
-
Aby se zabránílo 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í)
Příklad jména balíku
-
cz.muni.fi.pb162je možné a vhodné jméno balíku -
je světově unikátní, protože
cz.muni.fije obrácené doménové jméno fakulty (fi.muni.cz) -
pb162je 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říklad třídy v balíku
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.
|
Plný název třídy vč. balíku
-
Na třídu v balíku se odvoláváme plným názvem
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
Zápis třídy do zdrojového souboru
-
Umístění do balíků souvisí s umístěním zdrojových souborů na disku
-
Třída
Personbude v souboruPerson.java -
Tento soubor bude v adresáři
cz/muni/fi/pb162 -
Pozor na velká/malá písmena — v obsahu i názvu souboru i adresářů
Příslušnost třídy k balíku
-
Deklarujeme ji syntaxí:
package název.balíku; -
Uvádíme obvykle jako první deklaraci v zdrojovém souboru.
-
Příslušnost k balíku musíme současně potvrdit správným umístěním zdrojového souboru do adresářové struktury.
-
Neuvedeme-li příslušnost k balíku, stane se třída součástí tzv. implicitního balíku — prosím nepoužívat!
(Pseudo)hierarchie balíků
-
Balíky obvykle organizujeme do jakýchsi pseudohierarchií, např.:
-
cz.muni.fi.pb162 -
cz.muni.fi.pb162.banking -
cz.muni.fi.pb162.banking.credit
-
-
Nicméně není to tak, že by např. třída
cz.muni.fi.pb162.banking.Accountbyla současně v balíkucz.muni.fi.pb162.bankinga taky třebacz.muni.fi.pb162. -
Je-li třída v balíku
cz.muni.fi.pb162.banking, je pouze v něm a žádném jiném. -
Není ani v
cz.muni.fi.pb162, ani vcz.muni.fi.pb162.banking.credit.
| Prostě buď je ve stejném balíku nebo je v jiném :-) |
Použití tříd v různých balících
-
Balíky slouží k logickému rozčlenění kódu
-
Důsledkem je vzájemná "(ne)viditelnost" tříd
-
Velmi zjednodušeně: třídy v jednom balíku "mají k sobě blíž"
-
Jsou-li v různých balících, vůbec o sobě nemusí vědět
Odbočka: práva přístupu
-
Kromě toho rozhoduje i to, jakou viditelnost (právo přístupu) použijeme
-
Pro tento účel slouží modifikátory
public,protected,private -
Objasníme později
Příklad vzájemného použití tříd
-
Třídy ve stejném balíku: snadné vzájemné použití
Třída Person v balíku cz.muni.fi.pb162
package cz.muni.fi.pb162;
public class Person {
// attributes, methods
}
Třída Account v tomtéž balíku
package cz.muni.fi.pb162;
public class Account {
private Person owner; // owner of this Account is a Person
}
Příklad vzájemného použití tříd
-
Třídy v jiném balíku: nutné plné jméno
-
Třída
Accountv balíkuimport cz.muni.fi.pb162.banking -
použije pro třídu
Personjejí plný název balíku
package cz.muni.fi.pb162.banking;
public class Account {
private cz.muni.fi.pb162.Person owner; // full package name
}
Deklarace import
-
Nebo lze pro vzájemné odvolávání pomocí deklarace
import
package cz.muni.fi.pb162.banking;
import cz.muni.fi.pb162.Person;
public class Account {
private Person owner; // class name imported above
}
Deklarace import názevbalíku.NázevTřídy
-
Příklad
import cz.muni.fi.pb162.Person; -
Umožní použít identifikátor třídy (v našem případe
Person) v rámci jiné třídy. -
Píšeme obvykle ihned po deklaraci příslušnosti k balíku (
package názevbalíku;). -
Import není nutné deklarovat mezi třídami téhož balíku!
Deklarace import názevbalíku.*
-
Import všech tříd z balíku provedeme 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říduPerson, která z nich se použije? -
(nepoužije se žádná, dostanete kompilační chybu)
-
-
Nebudeme používat!
-
Pozn.: Hvězdičkou nezpřístupníme třídy z podbalíků — např.
import cz.*nezpřístupní tříducz.muni.fi.pb162.Person.