7.4 Pachete(packages)

Topic
Materials
sursa imagine : http://www.canstockphoto.com

Atunci când programăm este util să grupăm bucăţi de software.În Java acest lucru se poate obţine utilizând pachete(packages)

Un pachet(package) este similar cu o bibliotecă. Un pachet grupează tipuri similare de clase, interfețe și subpachete. Pachetele pot conține în interior alte pachete numite subpachete.

Un pachet ne oferă posibilitatea de a da nume unei colecţii de clase.

Într-un namespace fiecare clasă trebuie să aibă un nume unic.Când este definită o clasă într-un pachet, numele pachetului este ataşat la fiecare clasă pentru a evita conflictul cu alte clase cu acelaşi nume dar din pachete diferite.

Pachetele conţin de regulă clase care sunt într-o anumită relaţie. De aceea limbajul Java acordă drepturi speciale în interiorul pachetului. În interiorul pachetului putem defini cod care este accesibil altui cod din interiorul pachetului dar nu şi codului din exteriorul pachetului. În acest mod clasele vor relaţiona în mod privat doar în interiorul pachetului.

Pachetele îmbunătățesc eficiența codului datorită posibilității reutilizării lui. O clasă o dată scris într-un pachet se poate folosi în mod repetat nefiind nevoie să rescriem clasa respectivă. Pentru a folosi un pachet vom trebuie să-l importăm folosind cuvântul cheie import

Fiecare clasă aparţine unui pachet. Când nu este specificat cuvântul packages, este folosit pachetul implicit

Fiecare pachet este stocat în directorul său propriu.

Pachetele pot fi ierarhizate

De exemplu package pachet1.pachet2…..pachetN;

Pentru fiecare pachet trebuie creat un director.

import numePachet.subPachet.numeClasa;

//am importat o clasa cu numele numeClasa continuta intr-un pachet

Java conține mai multe pachete care pot fi folosite direct în programe

java.util – acest pachet conține clase care au legătură cu scrierea, citirea, manipularea stringurilor, structuri de date etc.

java.io – acest pachet conține clase necesare operațiilor

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. 

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:

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

 

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:javaprogramexercitiitest.

 

Î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:tempexercitiilab2.

 

 

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.