Pachete java

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.

Se recomanda 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: specificarea numelui complet al clasei (ex. folosire java.util.Vector) importul clasei respective (ex. import java.util.Vector) importul întregului pachet în care se gaseste clasa (ex. import java.util.*)

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.

De retinut: 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 Standard 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. ...

De retinut: 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.

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.

De retinut: 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.