Lucrul cu fisierele sursa si cu pachete

Fisiere sursa

Exista trei elemente de prim rang care pot aparea intr-un fisier. Nici unul nu este obligatoriu, insa daca apar, atunci trebuie scrise in ordinea: 

  1. declaratii de pachete, 
  2. instructiuni de includere (import) de clase, 
  3. definitii de clase.

Ce sunt pachetele?

Un pachet este o colectie de clase inrudite si interfete care asigura protejarea accesului si controlul spatiului numelor.

Clasele si interfetele care fac parte din platforma Java sunt membrii diferitelor pachete care grupeaza clase dupa functiuni: clasele fundamentale se gasesc java.lang, clasele pentru citiri si scrieri (intrari si iesiri) sunt  in java.io, si asa mai departe. Utilizatorul (dezvoltatorul, programatorul) isi poate si el grupa clasele si interfetele in pachete.

De ce sunt necesare pachetele?

Clasele si interfetele se grupeaza in pachete din cateva ratiuni:

Crearea unui pachet

Pentru a crea un pachet, trebuie introdusa o clasa sau o interfata in el. Pentru a face acest lucru, se adauga instructiunea package la inceputul fisierului sursa in care clasa sau interfata este definita. Spre exemplu, urmatorul cod apare in fisierul sursa Unu.java si introduce clasa Unu in pahetul numere:

package numere;

public class Unu {
    public Unu(){
        System. out .println ("Aici clasa Unu!");
    }
}


Trebuie inclusa instructiunea package la inceputul fiecarui fisier sursa ce defineste o clasa sau interfata care trebuie sa devina membru al pachetului numere. Astfel se poate adauga instructiunea package in fisierul Doi.java ce contine 

package numere;

public class Doi {
    public Doi(){
        System. out .println ("Aici clasa Doi!");
    }
}


Domeniul de influenta al instructiunii package statement este intregul fisier sursa in care apare, astfel incat cele doua clase Unu si Doi pot fi puse in acelesi fisier. Daca se pun mai multe clase intr-un singurt fisier sursa, numai una poate fi publica, si trebuie sa aiba acelasi nume cu numele fisierului (mai putin extensia). Numai membrii publici ai unui pachet sunt accesibili din exteriorul pachetului.

Daca nu este folosita instructiunea package, clasele si interfetele dintr-un fisier vor apartine pachetului default, care este un pachet care nu are nume. In general, pachetul default se foloseste numai pentru aplicatii mici sau temporale sau dezvoltarea aplicatiei este abia la inceput. In alte situatii, clasele si interfetele apartin unoar pachete care au nume.

Cum se aleg numele pachetelor?

In general este putin prababil ca doi programatori sa aleaga acelasi nume pentru pachete diferite. Totusi aceasta se poate intampla. Cum se rezolva aceasta? Simplu, prin adoptarea unei conventii.

O conventie buna este urmatoarea:

Companiile utilizeaza numele lor de domeniu pe Internet in ordine inversa, astfel:

com.evrika.numere

Pot apare coliziuni de nume chiar in interiorul aceleiasi companii. Pentru evitarea acestui lucru se mai adauga numele departamentului:

com.evrika.vest.numere

Importarea unui membru al unui pachet

se face folosind cuvantul cheie import ca in continuare:

import numere.Unu;

Importarea tuturor membrilor unui pachet

Se face folosind caracterul * la sfarsitul numelui pachetului.

import numere.*;

Exemplu

Daca dorim sa vedem cum functioneaza clasele Unu si Doi definite mai sus putem scrie un fisier cu numele Tst.java care sa contina codul

import numere.*;

public class Tst {
    public static void main (String [] args) {
        Unu u = new Unu ();
        Doi d = new Doi ();
    }
}

Pentru ca acest exemplu sa functioneze trebuie ca folderul ce contine sursa Tst.java sa aiba un subfolder cu numele numere. Iar in acest subfolder se gasesc fisierele Unu.java si Doi.java. Aceste fisiere trebuiesc compilate cu comenzile:

javac Unu.java
javac Doi.java

Inainte de a compila fisierul Tst.java trebuie sa fie declarat in variabila de mediu CLASSPATH calea catre fisierul Tst.java. Pe langa aceasta cale nu trebuie sa existe o cale catre subfolderul cu numele numere. Deoarece atat compilatorul cat si interpretorul Java cauta mai intai in folderul specificat in CLASSPATH si mai departe merge pe cale specificata de numele pachetului, in care punctele sunt inlocuite prin "/" in Windows si cu "\" in UNIX. Spre exemplu daca calea completa specificata in CLASSPATH este:

D:\_work\javaco;

atunci in acest folder trebuie sa se gaseasca fisierul Tst.java, ar in folderul

D:\_work\javaco\numere 

trebuie sa se gaseasca fisierele Unu.java si Doi.java.

In concluzie numele pachetului este folosit ca poteca, relativa la directorul curent, catre folderul care contine sursele si/sau clasele (adica fisierele cu extensia .class).

Cornel Mironel Niculae, 2003-2007

26-Jun-2007