Pachete de clase standard
Dezvoltarea unei aplicatii Java de mici dimensiuni presupune, de cele mai multe ori, plasarea fisierelor sursa intr-un singur director. In cazul in care aplicatiile sunt mult mai complexe, aceasta abordare nu mai este viabila.
In limbajul Java pachetele de clase reprezinta entitati logice care permit organizarea claselor si interfetelor. Pachetele de clase sunt colectii de clase si interfete inrudite, care asigura atat controlul accesului, cat si controlul spatiului de nume.
Pachetele de clase sunt utilizate in limbajul Java, deoarece permit:
• o mai buna organizare a aplicatiilor;
• evitarea conflictelor de nume intre clase sau interfete;
• utilizarea mult mai facila a anumitor clase si interfete;
• controlul accesului la clase si interfete.
Clasele si interfetele care fac parte din platforma Java sunt organizate in pachete de clase standard, in functie de functionalitate, grad de utilizare sau categorie. Cele mai cunoscute pachete de clase sunt:
Pachet clase | Descriere |
---|---|
java.lang | clase de baza ale limbajului Java |
java.io | clase care permit lucrul cu intrari/iesiri |
java.util | clase utilitare (colectii de obiecte) |
java.applet | clase care permit dezvoltarea de aplicatii web de tip applet |
java.awt | clase de baza pentru crearea de interfete grafice (GUI) |
java.awt.events | clase care permit tratarea evenimentelor |
java.beans | clase care permit dezvoltarea de componente reutilizabile |
java.math | clase care implementeaza operatii matematice |
java.net | clase care permit lucrul in retea |
java.sql | clase care permit accesarea bazelor de date relationale |
javax.swing | clase care permit dezvoltarea de interfete grafice independente de platforma |
java.security | clase care implementeaza diverse mecanisme de securitate |
java.text | clase care permit lucrul cu texte, date calendaristice sau valori numerice intr-un mod independent de limba |
Declarare pachete
Crearea unui pachet se realizeaza prin intermediul instructiunii package, care specifica un nume pentru pachetul care urmeaza a fi creat. Aceasta instructiune va fi plasata in fisierele sursa care cuprind clasele si interfetele din pachet.
Instructiunea package (declaratia de pachet) trebuie sa ocupe prima linie intr-un fisier sursa. De asemenea, nu poate fi specificata decat o singura declaratie de pachet intr-un fisier sursa. Daca un fisier sursa contine o instructiune package, aceasta va fi aplicata tuturor claselor si interfetelor definite in acel fisier sursa.
Clasa ObiectGrafic este declarata la nivelul pachetului ro.virtualcampus.obiectgrafic.
package ro.virtualcampus.obiectgrafic; | |
public abstract class ObiectGrafic { | |
protected double x, y; | |
public ObiectGrafic() { | |
x = 0; | |
y = 0; | |
} | |
public ObiectGrafic(double x, double y) { | |
this.x = x; | |
this.y = y; | |
} | |
@Override | |
public String toString() { | |
return "ObiectGrafic [x=" + x + ", y=" + y + "]"; | |
} | |
public abstract double aria(); | |
public abstract double perimetrul(); | |
public double getX() { | |
return x; | |
} | |
public void setX(double x) { | |
this.x = x; | |
} | |
public double getY() { | |
return y; | |
} | |
public void setY(double y) { | |
this.y = y; | |
} | |
} |
In mod similar, pot fi adaugate in pachetul ro.virtualcampus.obiectgrafic clasele Cerc, respectiv Dreptunghi (fiecare clasa se gaseste intr-un fisier sursa propriu).
package ro.virtualcampus.obiectgrafic; | |
public class Cerc extends ObiectGrafic { | |
private double raza; | |
public Cerc(double raza) { | |
super(); | |
this.raza = raza; | |
} | |
public Cerc(double x, double y, double raza) { | |
super(x, y); | |
this.raza = raza; | |
} | |
@Override | |
public String toString() { | |
return "Cerc [raza=" + raza + ", x=" + x + ", y=" + y + "]"; | |
} | |
@Override | |
public double aria() { | |
return java.lang.Math.PI * raza * raza; | |
} | |
@Override | |
public double perimetrul() { | |
return 2 * java.lang.Math.PI * raza; | |
} | |
public double getRaza() { | |
return raza; | |
} | |
public void setRaza(double raza) { | |
this.raza = raza; | |
} | |
} |
Pentru o aplicatie Java care nu utilizeaza instructiunea package, clasele si interfetele din fisierele sursa vor apartine pachetului default (implicit). Acest pachet nu are nume si se utilizeaza in special pentru aplicatii mici.
Intr-un fisier sursa pot aparea urmatoarele tipuri de elemente: declaratii de pachete, instructiuni pentru includerea unor pachete de clase (sau a unor clase individuale) si definitii de clase (sau interfete). Ordinea in care aceste elemente apar intr-un fisier sursa este cea specificata mai sus (declaratii de pachete, instructiuni import, definitii de clase si interfete).
In momentul in care dezvoltam sau utilizam clase si pachete de clase, trebuie sa avem in vedere faptul ca mai multi programatori pot alege acelasi nume pentru clase sau pachete de clase diferite. Pentru a evita conflictele de nume se apeleaza la diverse conventii cu privire la denumirea pachetelor de clase.
O prima conventie stabileste ca numele pachetelor sunt scrise cu litere mici pentru a evita conflictele cu numele claselor. De asemenea, companiile utilizeaza pentru denumirea pachetelor de clase numele de domeniu in ordine inversa, astfel:
com.company.region.pachet
In anumite situatii insa, numele de domeniu nu poate fi utilizat pentru a denumi pachete de clase: contine caractere speciale, cuvinte rezervate din limbajul Java sau incepe cu o cifra. O alta conventie sugereaza utilizarea unui caracter (_) (underscore) in astfel de cazuri.
clipart-open.org --> org.clipart_open free.fonts.int --> int_.fonts.free poetry.7days.com --> com._7days.poetry
Pachetele de clase standard din limbajul Java incep cu java sau javax.
Accesare pachete
Modificatorul public, specificat in declaratia unei clase sau interfete, asigura vizibilitatea clasei sau interfetei in alte pachete de clase. Pentru a accesa o clasa sau o interfata publica dintr-un pachet poate fi utilizata una din urmatoarele abordari:
• specificarea numelui complet pentru clasa sau interfata in cauza;
• includerea clasei sau interfetei;
• includerea intregului pachet de clase.
Daca se doreste utilizarea unui membru al unui pachet care nu a fost inclus (importat), este necesara specificarea numelui complet pentru acel membru. Avand in vedere pachetul de clase ro.virtualcampus.obiectgrafic, definit anterior, clasa principala a unei aplicatii care nu utilizeaza clauza import pentru a include acest pachet de clase va avea urmatoarea forma.
package ro.virtualcampus.app; | |
public class ObiecteGrafice { | |
public static void main(String args[]) { | |
ro.virtualcampus.obiectgrafic.Cerc cerc = | |
new ro.virtualcampus.obiectgrafic.Cerc(2.3, 3.4, 1.5); | |
ro.virtualcampus.obiectgrafic.Dreptunghi dreptunghi = | |
new ro.virtualcampus.obiectgrafic.Dreptunghi(5.2, 1.8, 3.4, 4.8); | |
System.out.println(cerc); | |
System.out.println(dreptunghi); | |
System.out.printf("Aria cerc: %.2f %n", cerc.aria()); | |
System.out.printf("Perimetru cerc: %.2f %n", cerc.perimetrul()); | |
System.out.printf("Aria dreptunghi: %.2f %n", dreptunghi.aria()); | |
System.out.printf("Perimetru dreptunghi: %.2f %n", dreptunghi.perimetrul()); | |
} | |
} |
Aceasta abordare prezinta anumite limitari in cazul in care membrii unui pachet sunt referiti intr-un mod intensiv. Pentru a include doar anumiti membri ai unui pachet poate fi utilizata clauza import.
package ro.virtualcampus.app; | |
import ro.virtualcampus.obiectgrafic.Cerc; | |
import ro.virtualcampus.obiectgrafic.Dreptunghi; | |
public class ObiecteGrafice { | |
public static void main(String args[]) { | |
Cerc cerc = new Cerc(2.3, 3.4, 1.5); | |
Dreptunghi dreptunghi = new Dreptunghi(5.2, 1.8, 3.4, 4.8); | |
System.out.println(cerc); | |
System.out.println(dreptunghi); | |
System.out.printf("Aria cerc: %.2f %n", cerc.aria()); | |
System.out.printf("Perimetru cerc: %.2f %n", cerc.perimetrul()); | |
System.out.printf("Aria dreptunghi: %.2f %n", dreptunghi.aria()); | |
System.out.printf("Perimetru dreptunghi: %.2f %n", dreptunghi.perimetrul()); | |
} | |
} |
Dupa includere, clasele pot fi referite doar prin intermediul numelui. Aceasta abordare este utila in cazul in care se utilizeaza un numar redus de membri din pachet.
Cea de-a treia varianta permite includerea tuturor claselor din pachet prin intermediul unei singure clauze import. Pentru a include toate clasele si interfetele dintr-un pachet se utilizeaza caracterul (*) dupa numele pachetului. Si in acest caz referirea unor membri din pachetul inclus se face doar prin numele lor.
package ro.virtualcampus.app; | |
import ro.virtualcampus.obiectgrafic.*; | |
public class ObiecteGrafice { | |
public static void main(String args[]) { | |
Cerc cerc = new Cerc(2.3, 3.4, 1.5); | |
Dreptunghi dreptunghi = new Dreptunghi(5.2, 1.8, 3.4, 4.8); | |
System.out.println(cerc); | |
System.out.println(dreptunghi); | |
System.out.printf("Aria cerc: %.2f %n", cerc.aria()); | |
System.out.printf("Perimetru cerc: %.2f %n", cerc.perimetrul()); | |
System.out.printf("Aria dreptunghi: %.2f %n", dreptunghi.aria()); | |
System.out.printf("Perimetru dreptunghi: %.2f %n", dreptunghi.perimetrul()); | |
} | |
} |
Intr-o aplicatie Java sunt incluse (importate) implicit urmatoarele pachete de clase: pachetul java.lang, pachetul curent si pachetul implicit.
Prin conventie toate fisierele sursa (.java) care contin clase si interfete ale unui pachet sunt salvate intr-un director cu numele pachetului. Desi acest lucru nu este impus, el duce la o mai buna structurare a fisierelor dintr-o aplicatie Java.
Fisierele .class rezultate in urma compilarii claselor si interfetelor dintr-un pachet sunt salvate automat intr-un director care are acelasi nume cu pachetul in care au fost definite clasele si interfetele.
Daca este necesar, un pachet de clase poate fi organizat ierarhic in subpachete prin alaturarea numelor cu ajutorul caracterului (.). Referirea unei clase dintr-un subpachet se face astfel:
pachet.subpachet.clasa
Includerea tuturor claselor dintr-un pachet principal, prin intermediul unei clauze import, nu presupune si includerea claselor din subpachete.
La rulare, masina virtuala Java va cauta orice referire la o clasa (sau pachet) pornind din directorul curent, iar daca aceasta nu este gasita se va trece la examinarea variabilei de mediu CLASSPATH.
Fisierele .class se vor gasi intr-o structura de subdirectoare identica cu relatia pachet-subpachet, fie in directorul curent, fie intr-un director specificat in CLASSPATH. Din motive de spatiu, structura cu subdirectoarele unui pachet poate fi pastrata impachetata intr-o arhiva .jar – Java Archive (asemanatoare altor arhive, ex. zip).