Un pachet este o colectie de clase si
interfete înrudite. Sunt folosite pentru gasirea si utilizarea mai usoara
a claselor, pentru a evita conflictele de nume si pentru a controla accesul la
anumite clase. In alte limbaje de programare pachetele se numesc librarii.
Construirea unui pachet
Pentru a declara un pachet în java se foloseşte cuvântul cheie package urmat de numele pachetului. Cuvântul
cheie package se foloseşte ca primă
instrucţiune în fişierele sursă java şi specifică
numele pachetului din care vor face parte clasele ce urmează să fie
definite în acel fişier.
package mypakcage;
class
Forma{
…
}
Daca nu este specificat un anumit pachet, clasele unui fişier sursa
vor face parte din pachetul implicit (care nu are nici un nume). In general,
pachetul implicit este format din toate clasele si intefetele
directorului curent.
Este recomandabil ca toate clasele si intefetele sa
fie plasate în pachete. Pachetul implicit este folosit doar pentru aplicatii mici sau la începutul dezvoltarii
unei aplicaţii.
Accesul la clasele dintr-un
pachet
Pentru a folosi o
clasa publica dintr-un pachet sau pentru a apela o metoda publica a unei clase
public a unui pachet exista trei solutii:
Pentru a avea acces la o clasă definită în cadrul unui pachet
dintr-o clasă definită în alt pachet se foloseşte cuvântul cheie
import urmat de numele pachetului
şi de numele clasei care trebuie accesată.
import mypackage.Forma;
class
Desenator{
…
}
O variantă a instrucţiunii import este următoarea:
import mypackage.*;
class
Desenator{
…
}
În cazul în care în loc de numele clasei se foloseşte caracterul
“*” atunci se va avea acces la toate clasele din cadrul pachetului respectiv.
IMPORTANT: O clasă definită în cadrul unui pachet va putea
accesa toate celelalte clase din cadrul acelui pachet fără a fi
nevoie să se folosească instrucţiunea import.
Reguli de denumire a pachetelor
Deşi este perfect valid un nume de pachet format dintr-un singur
cuvânt, în mod uzual în java numele pachetelor sunt formate din două sau
mai multe cuvinte separate prin caracterul punct. Aceasta ajută
programatorul în crearea de nume unice pentru pachete astfel încât şansele
ca două nume de pachete să se suprapună să fie cât mai
mici.
De exemplu pachetele standard ce sunt accesibile din Java 2 Standard Development Kit au nume de forma:
java.lang –
conţine clase esenţiale java. Acest pachet este automat importat,
şi orice clasă are acces la clasele din cadrul acestui pachet
fără a fi nevoie să fie importate în mod explicit;
java.io –
conţine clase pentru lucrul cu fluxuri de intrare \ ieşire;
java.net – conţine clase
pentru lucrul cu resurse de retea
java.swing, java.awt, java.awt.event – sunt
pachete ce conţin clase pentru construirea de interfeţe grafice;
java.sql –
conţine clase pentru lucrul cu baze de date
Companiile ce produc software java folosesc uneori numele propriu de
domeniu ca şi componentă în cadrul numelui pachetelor. De exemplu:
com.mysq.driver.
...
com.sun.util.
...
ATENTIE: Numele ierarhice de pachete nu implică nici o relaţie
de moştenire sau de includere între clasele aparţinătoare. De
exemplu dacă în cadrul unei clase se importă pachetul java.awt, din clasa respectivă nu se va avea acces
şi la metodele din pachetul java.awt.event.
EXERCITIU: Construiţi în mediul Eclipse un nou proiect Java.
Adăugaţi în cadrul proiectului o clasă test ce conţine o
funcţie main care să facă parte din
pachetul lab2.exercitii.
EXERCITIU: Adăugaţi în cadrul proiectului construit în
exerciţiul anterior un nou pachet numit lab2.alteexercitii. În cadrul
noului pachet adăugaţi o clasă care va importa clasa Test din
exerciţiul anterior.
Reguli de construire a
pachetelor
Locaţia fişierelor sursă java este dependentă de
numele pachetelor pe care acestea le definesc. Numele pachetului determină
şi locaţia fişierului sursă. De exemplu dacă o
clasă este declarată ca făcând parte din pachetul exercitii.test atunci aceasta va trebui sa se
găsească într-un director de forma .../exercitii/test.
Numele pachetului determină aşadar ierarhia de directoare în
care trebuie să se găsească fişierele sursă. De
asemenea fişierele compilate (fişierele cu extensia .class) trebuie să urmeze aceiaşi regulă. Nu
este obligatoriu ca fişierele sursă şi fişierele compilate
să se regăsească în aceiaşi ierarhie de directoare dar este
obligatoriu ca ierarhiile de directoare să respecte regula prezentată
mai sus atât pentru fişierele sursă cât şi pentru fişierele
class.
Exemplu:
fişier Test.java
package exercitii.lab2
class Test{
}
Fişierul sursă poate fi salvat într-un director de forma:
c:\java\program\exercitii\test.
În urma compilării fişierului sursă de mai sus
rezultă fişierul cod de octeţi Test.class.
Acesta poate fi amplasat fie în acelaşi director cu fişierul
sursă Test.java fie într-un alt director care
să respecte regula numelui pachetului, de exemplu: d:\temp\exercitii\lab2.
Accesare pachetelor
Pentru a putea accesa clasele din cadrul pachetelor, limbajul java
foloseşte o variabilă de mediu numită CLASSPATH. Pentru a putea
avea acces la clasele dintr-un pachet directorul rădăcină ce
conţine ierarhia de directoare corespunzătoare pachetului va trebui
să fie adăugat în cadrul listei de directoare CLASSPATH.
De exemplu în cazul în care se doreşte ca dintr-o aplicaţie
să fie accesibilă clasa Test.class
definită mai sus atunci în CLASSPATH va trebui adăugat directorul
c:\temp.
Directoarele setate în cadrul variabilei de mediu CLASSPATH sunt
folosite ca punt de start al căutării fişierelor cu .class.
În momentul în care compilatorul întâlneşte o instrucţiune import acesta va căuta pachetul
desemnat de acea instrucţiune în toate directoarele definite în CLASSPATH,
transformând numele pachetului într-o listă de directoare şi
încercând să găsească pachetul prin concatenarea pe rând a
directoarelor specificate în CLASSPATH cu ierarhia de directoare generată
din numele pachetului.
ATENTIE: Dacă două pachete conţin clase cu acelaşi
nume şi ambele pachete sunt importate atunci va apărea o coliziune de
nume dacă se încearcă folosirea clasei cu nume comun în cele
două pachete. Dacă pachetele sunt doar importate şi nu se
foloseşte în cadrul aplicaţiei clasa cu nume comun în cele două
pachete nu se va raporta nici o eroare.