Balíky (packages)

Organizace tříd do balíků

  • 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

Světově unikátní pojmenování balíků

  • 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í).

Příklad jména balíku

  • 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.

Umístění třídy do balíku

  • 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.

Použití třídy z balíku

  • 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.

Import třídy z balíku

  • 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 celého balíku

  • 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)

Podbalíky a viditelnost

  • 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í.