Enrera
Mòdul 2
Iniciació a la programació en Java
  Pràctica
1
2
3
4
4
   
Exercicis
Exercicis
 
 

Els paquets: fer codi i aprofitar-lo per a qualsevol altre programa.

   

En si mateix Java és un llenguatge senzill. Gran part de la seva força, de la capacitat de fer les tasques més complexes o resoldre els problemes més específics està en la gran quantitat de paquets de què disposa. Un paquet (package) és un conjunt de classes organitzades internament que "es veuen" les unes a les altres i comparteixen els seus recursos i capacitats. En certa forma, un paquet és un "mòdul" del llenguatge, el qual puc incorporar optativament en els meus programes sempre que el necessiti.

Per exemple, una bona part de les utilitats per a manipular cadenes estan en un paquet. Aquest paquet té el nom "java.text". Conté classes per a formatar dates (DateFormat) , formatar nombres que tenen decimals (DecimalFormat) i un grapat més. Si jo vull utilitzar aquestes classes ho de d'especificar tot important el paquet a la capçalera del codi dels meus programes.

Si penso utilitzar la classe java.text.DateFormat en un programa, he d'escriure aquesta primera línia a dalt de tot del codi:

import java.text.DateFormat;

Amb això, ara ja podria utilitzar la classe DateFormat, però no les altres classes que hi ha al paquet. Ara, si escric:

import java.text.*;

llavors ja podré utilitzar DateFormat, DecimalFormat i la resta de classes del paquet. El rendiment global d'un programa no es degrada pel fet d'importar paquets sencers. Per això, molts programadors importen tot el paquet quan en necessiten, encara que sigui només una classe. En contrapartida, un programa és més llegible si només importa allò que necessita. Podeu triar l'opció que vulgueu quan escriviu els vostres programes.

Els paquets que venen amb el SDK comencen per "java." N'hi ha molts, cada cop més, en la mesura que va creixent el propi llenguatge. Alguns dels més importants són:

java.lang, conté les funcions pròpies del llenguatge. Aquest no cal importar-lo, ja que el compilador considera que l'importem cada cop que fem un programa.

java.util, amb tot d'utilitats addicionals.

java.text, amb utilitats de format i manipulació de textos.

java.math, amb funcions matemàtiques.

java.io, amb rutines d'entrada i sortida

java.net, amb utilitats de xarxa.

java.applet, per a construir applets.

java.awt, per a gràfics i interfícies gràfiques d'usuari (GUI).

java.sql, classes per a accedir a bases de dades.

Aquest sistema de paquets és també el que utilitzarem nosaltres amb la funció de desar i reutilitzar els nostres programes. Com a programadors podem crear paquets amb enorme facilitat i incorporar-los (importar-los) als nostres programes sempre que vulguem, o bé, podem intercanviar paquets amb altres programadors i sumar-los amb tota facilitat als nostres programes.

Hi ha, però, dues diferències fonamentals entre els nostres paquets i els que porta el SDK de Java:

  1. Nosaltres no crearem paquets que comencin per java.elnomdepaquet. El que farem serà utilitzar noms particulars. Aquests són noms possibles:

    lamevaempresa.elprojectequesigui.utilitats

    asolans.xat.netutils

    cromero.jocdevaixells.formules

    com.utilsoft.enquestes.preguntes


    Observeu que podem crear tantes subdivisions com vulguem dins d'un paquet. Així es pot organitzar de forma jeràrquica tot el programari que pot construir no solament un programador, sinó una empresa de centenars d'enginyers: és una manera molt elegant i pràctica d'ordenar els programes.

  2. Quan creem paquets particulars, el compilador de Java els busca al directori actual. Si no els troba, llavors rastreja tots els directoris que estan definits a la variable d'entorn CLASSPATH. Nosaltres no definirem aquesta variable directament al nostre ordinador: amb JCreator ho farem més fàcilment.
Crear un paquet:
 

Imaginem que el nostre cap ens encarrega que preparem un programa que serveixi per traduir els dies de la setmana de número a text en català. Ens diu que el programa s'ha de dir DiaenCatala i ha d'estar a disposició de tots els programes de la nostra empresa dins el paquet d110.utils.

Creem en primer lloc el programa de traducció que ens demanen, tot incorporant-lo al paquet d110.utils. Observeu la declaració package d110.utils; al començament del programa. És l'únic requisit que hem de seguir per poder informar que el programa DiaenCatalà pertany al paquet d110 i al subpaquet utils

   
 

package d110.utils;

import java.util.Date;

/**
* Programa per a traduir els dies de la setmana al català
* -------------------------------------------------------------
*/

public class DiaenCatala {
    private Date eldia;
    private int dianumero;

    public DiaenCatala(java.util.Date eldia) {
        this.eldia=eldia;
    }

    public String getDia() {
        dianumero=eldia.getDay();
        String sdia="";
        switch( dianumero ) {
            case 1:
                sdia="Dilluns";
                break;
            case 2:
                sdia="Dimarts";
                break;
            case 3:
                sdia="Dimecres";
            break;
             case 4:
                sdia="Dijous";
                break;
            case 5:
                sdia="Divendres";
                break;
            case 6:
                sdia="Dissabte";
                break;
            case 0:
                sdia="Diumenge";
                break;
            }
            return sdia;
        }
}

   
 

Enregistrem el programa i el compilem amb JCreator. El programa ens avisa que ha completat el procés de compilació sense problemes. Tot i que sembla que no ha passat res d'estrany, si anem a la carpeta on tenim DiaenCatala.java, veurem que ha passat quelcom de nou; busqueu el fitxer corresponent DiaenCatala.class: no el trobaru ni al costat del fitxer font ni a la carpeta /classes, si és que teníem separats el codi dels fitxers compilats.

Sí que trobarem una carpeta nova que es diu /d110. Obrim-la. Observarem que a dins s'hi ha creat una carpeta nova que es diu utils. Obrim-la i a l'interior hi trobarem el fitxer DiaenCatala.class. Endevineu què ha passat? Quan el compilador de Java troba una definició de package en un programa, va creant una estructura jeràrquica de directoris equivalent als noms dels paquets, tants directoris com paraules separades per punts. Al final de tot hi deixa el fitxer del programa compilat.

Ara, per a la utilització del nostre programa DiaenCatala des d'un altre programa, només ens cal fer la importació amb l'expressió import d110.utils.DiaenCatala;

Provem-ho. Tornem a obrir JCreator i fem aquest programa, que es diu "QuinDia":

   

import java.util.Date;
import d110.utils.DiaenCatala;

/**
* Programa que ens diu quin dia de la setmana és avui.
* -------------------------------------------------------------
*/

public class QuinDia {
    public static void main(String[] args) {
    System.out.println( "Avui és "+new DiaenCatala(
                               new Date()).getDia() );
    }
}

 

   
 

Hem importat DiaenCatala juntament amb java.util.Date, i en cridem el seu mètode getDia() per fer una sortida en pantalla que ens informa de quin dia de la setmana és avui, en català.

Aquest programa funciona perquè el paquet d110 és a l'arrel de l'aplicació QuinDia. Com que el compilador, en primer lloc, busca els paquets en aquest directori, l'ha trobat sense dificultat. Hem de reconéixer que això no és gens pràctic. Hem de tenir tots els programes auxiliars a l'arrel del directori de treball? És clar que no. El directori-paquet d110 pot estar a qualsevol lloc de l'ordinador, on ens sigui més còmode. L'únic que hem de fer és dir-li al compil·lador on el pot trobar.

Hem decidit deixar el paquet d110 en un directori que es diu c:/java/paquets, lloc on anirem posant tots els programes auxiliars.

  • Copiem el directori d110 i tot el contingut en el directori c:/java/paquets, el qual també creem de nou.

  • Obrim JCreator i li indiquem, com a opció de projecte, que incorpori el paquet:
Incorporar llibreries o paquets a JCreator:
   
 
  • Obrim "Project | Project Settings ...". Obrim la pestanya "Required Libraries". Piquem sobre el botó "New" per a incorporar un nou paquet o llibreria.

  • A la fitxa que s'obre, "Set Library", hi escriurem un nom identificador del paquet i triarem el lloc on estarà situat:

    • Escrivim "d110" a la caixa amb el nom del paquet.

    • A la pestanya "Classes" piquem sobre el botó "Add" i l'opció "Add Path". Navegem fins a c:/java/paquets/ i el triem. La finestra ha de tenir aquest aspecte:



 

    • Piquem sobre el botó "OK" i ja tenim disponible per al projecte actual tots els recursos que hi ha al paquet d110.

Així doncs, cada cop que necessitem recursos externs, hem de treballar amb directoris, subdirectoris i fitxers? No, és clar. Els dissenyadors de Java ja van pensar que això no era massa còmode. Per tal de facilitar encara més la feina, van fer possible que tots els directoris d'un paquet es poguessin comprimir en un sol fitxer ZIP. La Màquina Virtual de Java sap llegir dins dels fitxers ZIP i els tracta igual que si fossin directoris oberts.

De fet, el SDK incorpora una utilitat per a fer la feina de comprimir directoris que contenen paquets i deixar-los com a arxius de llibreria de Java. El programa es diu jar.exe i es troba al directori /bin de la nostra distribució de Java. Construeix fitxers amb l'extensió *.jar que són fitxers comprimits en format ZIP que poden contenir informació addicional per a Màquina Virtual de Java q ue els ha de llegir.

   
  Crear una llibreria amb JAR.exe
   

Si en algun moment considerem que el paquet d110 ja és complet i que no haurem de compilar més les classes que el componen, el podem tancar en el fitxer d110.jar. Llavors aquest fitxer, que ja és una llibreria de Java, es pot deixar a qualsevol lloc, es pot distribuir i es pot incorporar amb més comoditat als nostres programes, en substitució del directori d110 i les seves carpetes

Fem-ne la prova:

  • Obrim una finestra de línia de comanaments (terminal de DOS, MS DOS) i anem al directori c:/java/paquets, on és ara el directori /d110.

  • Executem jar.exe amb la instruccio:

    C:\java\paquets>c:/jdk1.3.1_04/bin/jar cvf d110.jar d110

    (Substituiu c:/jdk1.3.1_04 pel directori on tingueu la vostra distribució del SDK). El programa ha de contestar d'una forma similar a aquesta:
   
 
  • Ara tenim a c:/java/paquets el fitxer d110.jar,el qual podem distribuir lliurement. Amb JCreator, per tal d'incorporar-lo triaríem l'opció "Add File" en lloc de l'opció "Add Path"en el moment d'afegir la llibreria
   

A la pràctica 4 del mòdul 1 vàrem aprendre a afegir eines personalitzades a JCreator. Seríeu capaços d'afegir la utilitat jar.exe per tal facilitat la creació de llibreries de Java?

   
   
   
 
Amunt