Professional Documents
Culture Documents
writersWalting
4 tsi ge asteapta pana cond se. obtine{4 COORDONAREA FIRELOR DE EXECUTIE
% 20 motificare de ta metoda geri). of
% public synchronized vold put(char c)
(
0 while( isFUllO))
»
Muy
™ fl
» writersWaiting 44;
” wait:
sy
hs cateh( InterruptedException ©)
. O
“ writersWaiting
yo
> bufllast ee) =e:
i If (readersWaiting > 0)
oot
S| notityA(:
ae
“
> fee Bstrage primal caracter din Buffer. Daca bufferat
nb este gol, se incrementeaza readersWaiting si re
St asteapra pana cand se obline 0 motificare
bp tde la metoda get(). +
public synchronized char get()
sf
while isEmpty Q)
> ot
a ty
of
« readersWalting ++
« wait:
5 )
eateh(IntercuptedBxception e)
* }
« sadersWaiting——:
an)
© char ¢ = bufto}:
System arrayeopy (buf, 1, but, 0, ——Last):
GAP CwvritersWatting >'0)
>
” notify AIL Qs
50
oan
”
up’ cum aji observat, metodele get () si put () au fost ficute mai in-
teligente. Ele verifc mai inti daca este necesara vreo notificare (nile 44 si
257{4 COORDONAREA FIRELOR DE EXECUTIE
69), dupa care utilizeaz not ifyA11() pentru a difuza notificarea la toate
firele de execusie aflate in asteptare,
84.7 Utilizarea lui Interruptedzxcept ion
Aji observat cu siguranji utilizarea consecventi de-a lungul acestui capitol
a clasei InterruptedExcept ion. Daci vefi examina modul in care este
declaratii metoda wait () tn clasa Object, vetiinjelege de ce:
Public final void wait() throws InterraptedException
wait () declard cd ar putea si arunce o Interruptedexception. A-
cast exceptie se genereazi atunci cind se apeleaza metoda interrupt () a
clasei Thread. Limbajul Java oferi posibilitatea de a intrerupe asteptarea de
orice natura (wait, sleep) a unui fir de executie prin generarea unei exceptii de
lipul Tnterrupted=xcept ion intrn alt fir de executie, folosind metoda
interrupt (). Aceasti metodi este uti
aflate fn asteplare in eadrului unui wait (), sleep () sau aaltor operati (de
exemplu cite de la un socket)
ati pentra a trezi firele de executie
Rezumat
Este deosebit de important si distingem situaile in care este cazul si se
utilizeze mai multe fire de execufie de situaile in care trebuie si le evitim. Cel
‘mai important motiv pentru utilizarea firelor de exeeusie este necesitatea de a
realiza mai multe operaii,a ciror rulare amalgamati va produce o utilizare mai
ficient a maginii de calcul (incluzsind aici si posibilitatea de a distribui opera
fille pe mai multe procesoate) sau va imbunitiiinteraetiunea cu utilizatorul,
rea fielor de execufie are si dezavantaje, cum ar fi sc&derea
vitezei din cauza asteptirii dupa resurse partajate gi cresterea utlizarii proce-
sorului pentru a le gestions,
Un alt avantaj important al firelor de executie este ci, aga cum am mentionat
la inceputul capitolului, ele inlocuiese schimbiirile de context mari consuma-
toare de resurse generate de procese (de ordinul miilor de instrucyiuni) cu schim-
bride context rapide (de ordinul sutelor de insteucjiuni). Avand in vedere fap-
tul c& toate firele de execuie din cadmul unui proces partajeaz’ aceeasi zon’
de memorie, o schimbare de context nu implica in acest eaz decét modificarea
punctului de execute $i a variabilelor locale, Pe de alt& parte, o schimbare de
context in cazul proceselor implica interschimbarea intregului spajiu de memo-
258{4 COORDONAREA FIRELOR DE EXECUTIE
Fircle de executie reprezinta o lume nous, iar a inva si le utilizezi este
echivalentcu asimilarea unui nou limbaj de programare. Una dintre principalele
dificultayi egati de frele de executie este dati de faptul ci’ mai multe fre pot
partaja aceleasi resurse, cum ar fi atributele unui obiect, iar in acest ca trebuie
sit Vi asigurafi ci nu se poate intimpla ca mai multe fire sa incerce si acceseze
resursa in acelagi timp, Accasta presupune utilizarea atent& a cuvantului cheie
synchronized, care este o unealtd extrem de utili, dar care trebuie injeleasi
in profunzime, deoarece poate si provoace situafii subtle de blocaj circular,
Capitolul de fayi este departe de a epuiza toate subiectele legate de firele
de execusie. Nu am vorbit aici despre prioritatea fitelor de executie, despre
sgruputi de fire de execusie si clasa ThveadGroup sau despre fire de execusie
daemon, Veji gisiinformayii despre toate aceste subiecte in excelenta carte a lui
Bruce Eckel, Thinking in Java (vezi {Eckel)). Pentru 0 prezentare mai avansat
a firelor de executie, consultaji Concurrent Programming in Java, de Doug Lea,
Addison-Wesley, 1997.
Notiuni fundamentale
blocaj circular (deadlock): situate in care dou’ sau mai multe fire de exe-
coufie asteapti eliberarea a dou sau mai multe resurse pe care le detin reciproc
(deci nu vor fi niciodatt eliberate).
coordonare: termen utilizat pentru a desemna dirijarea executici a dou sau
‘mai multe fire de execujie folosind metodele wait () gi notify ()
fir de executie (thread) : un flux de execujie tn cadrul unui proces.
inconsistenfé la concurenfa (race condition): eroare de programare care
cauzeazi comportamentul eronat sau imprevizibl al unui program. Mai exact,
aceasti eroare apare in cazul in care rezultatul unei operafii depinde de factori
temporali imprevizibili, cum ar fi ordinea in care s-a alocat timp penteu execuyia
firelor de executic.
‘monitor: obiect special utilizat pentru a realiza excluderea reciproci a unui
grup de metode,
tajare de resurse: dou’ sau mai multe fie de execujie au acces la ace-
leasi resurse (de exemplu, la atributele unui obiect).
Proces: program de sine stititor, care dispune de propriul lui spatiu de
adrese
serializare: consti in a impune accesul unui singur fir de execujie la un
‘moment dat lao resursi in acelagi timp.
sineronizare: reprezint& coordonarea unor evenimente astfel incdt doar un
anumit eveniment se produce la un moment dat,
259,{4 COORDONAREA FIRELOR DE EXECUTIE
Erori freevente
1, Ceamai freeventi eroare este ci programatorul nu este constient ci uleazi
intr-un mediu multithreaded (de exemplu in cazul unui servlet Java) si
serie cod ignoriind complet inconsistenfele la concurenga.
2. Multi ncepitori definese firele de executie corect, dar uti si Ie pomeasci
3. Din cauza grabei sau a lipsei de experienfi, adeseori nu sunt detectate
secvenele de cod care pot conduce la inconsisteng la concureni
4, Nu este suficient s& sincronizém modificatorii unui aribut pentru a objine
cconsistenja la concurenta. Trebuie sincronizate si secvengele de cod care
acceseazA acelatribut
5, Apelarea metodei wait () pe alt obiect decat cel pe care s-a ficut sin-
‘ronizarea va genera o I1 legalMonitorStateExcept ion.
6. Apelul lui not ify () pe un object pentru a notifica un fir de executie
‘care se afli in asteptare pe un alt obiect, nu va avea nici un efect.
Pe scurt
1, Care este diferenja inte fire de execute si procese?
2. Ce interfafi Java trebuie implementatd de cite firele de execusie?
3. Ce metodi este apelata pentnu a porni un fir de executie?
4, Ce metodi este apelati de citre magina virtual la pornirea unui fir de
executie?
5. Cand trebuie utilizat cuvantul cheie synchronized?
6. Cand este de preferat instructiunea synchronized () metodelor sin-
‘eronizate?
7. Ce este un monitor?
8, Care este diferenga intre coordonatea gi sincronizarea fitelor de execusie?
260$4, cooRDONAREA MRELOR DE EXECUTE
In practic
1. Creai dowi clase derivate din Thread. Metoda run () a primei clase
objine o refering citre cea de-a doua clasi, dupi care apeleazi wait ()
pe acest obiect. Metoda run () a celei de-a doua clase va apela metoda
not fyAl2 () pentru primul fir dupa cateva secunde, astfelincdt acesta
i poatd afiga un mesaj
2. Construifioclasti Account Test eare si puniiin evident problemele de
inconsistengi la concureni pe care le are clasa Account din paragraful
83.2.
3. Modul in care este implementati metoda get () in clasa Buffer din
paragraful 8.4.3 este ineficient, deoarece necesiti deplasarea tuturor ele-
‘mentelor din buffer cdtre stinga (avand astfel complexitatea O(n)). Mo-
\ificaji clasa Buffer pentru a refine elementele sub forma unei cozi
(etalii despre cozi in volumul al doilea, dedicat structurilor de date gi al-
goritmilor) astfel inedt metodele put () si get () si aibiicomplexitatea
000)
4, Clasele Buffert, Consumert si Producer? din paragraful 8.4.5,
constituie o implementare a problemei bufTenului cu un singur produci-
{or siun singur consumatorin care sineronizarea $i coordonarea firelor de
cexecutie este Ficuti in eadrul producatorului si consumatorului. Adaptaji
aceasti solujie pentru a funciona si in eazul problemei bufferului cu pro-
Settings -> Control Panel;
3. Figienul j2sdk-1_4_0-win exe reprezinti programul de instalare al
Java 2 SDK. Rulayi fisicrul si urmaigiinstrucgiunile simple care va sunt
furnizate de program;
4, Setali variabila sistem PATH. Setarea variabilei sistem PATH vi per-
mite si puteii ula convenabil executablele Java 2 SDK (javac.exe,
Java.exe, javadoc .exe etc.) din orice director fied si fie nevoie si
Serie Intreaga cale in linia de comand’, Daci nu setati variabila PATH,
va trebui si specifica intreaga cale citre executabil de fiecare dati cind
dori sit rulayi cain exemplul de mai jos:
Tmeabytes
Acme tomsi Ia versinnea Kitt Dact afi ales © att versie a kth Java 2 SDK (de
employ, 1.30 et), mai mul ca sigur dimensunen fier afi al,
rename anterioar versa ale
268c:>\jdkl.4\bin\javac MyClass. java
Peatr a evita o asemenea sntatd incomods, ediugafintreage cle a de
rectorulii 3dk1 , \bin In variaila sistem PATH. Dacia instalare afi
ties option implicit, calea shook
ste c:\jdk1.4\bin
Setarea ci se ealizeazidiferit, in fancied versinea Windows pe care
0 fotos
= pentra Windows NT, Windows 2000 si Windows XP: apisaji Star, Ser
tings, Control Panel, dubla click pe System. in cazul Windows NT, se-
lect tabsul Environment; la Windows 2000 seletat tab-ul Advanced
si Environment Variables. Apoi, chai variabila sistem PATH tn User
Variables sau System Variables. Dac nu suntfi sigur unde anume dori
si adiugaicalea citre executabiele Java, adugayi-o la final variable
PATH din User Variables, Configurar cit congine calea absolutd a
director in care est instalat Java (de exemplu, ¢:\ jak .4\ bin),
Seriereaculitere mari sau mici mu are vreo influent, In fina, apasai Se,
OK sau Apply. Variabila sistem PATH este o succesiune de directoare
separate de ":", Sistemul de operare Windows cauta executbilele Java
Gavac, java, javadoc, etc) indretoarele menfionate in cae, pa
curgandvariabila PATH dela stinga la deapta. Este important de rejinut
cin PATH tebuie save un singur director bin pentru Java SDK laun
‘moment dat (celelaltediretoare de acest fel care urmesia dupa primul,
sintignorate). Nous cale are efet in feeare nou fereast Command
Prompt pe care o deschieti sa in iecare program pe cae il exeeua de
acum inainte (cum a 8 JEAit, Creator et.)
= pentmi Windows 98, Windows 95: editaifigienal autoexec.bat (for
losind de exemplu Start -> Run sysedit). Ciutai seevenja in care
este definti varabila PATA gi adiugai in final calea absolut cite ex-
ceutabilele Java, Daci nu exist nici o seven de defnire a varabilei
PATH, adiugai-o pe o posite onrecare in fiir. lati un exemplu tpic
pentr setarea variable PATH
in care se alli exccutabilele Java
PATH C:\WINDONS,
\WINDOWS\COMMAND; ¢:\Jdk1.4\bin
Serierea cu literele mari sau mici nu are nici o influen{i. Pentru ca setarea
li sX devin’ functional’, executati urmatoarea instructiune intro fereas-
i Command Prompt
autoexec.bat
269,|A2.INSTALAREA MEDIULULIAVA
Pentru a afla setarea curenti a ctl sau pentru a vedea daca a avut efect
schimbarea, tastaji in linia de comand’:
cr\> path
in acest moment, sistemol dumneavoasra este pregtit pent utlizarea Java
2 SDK. Peni a verifiea acest Iver, exccutaiintran Command Prompt co-
manda
c:\>java -version
Daca instalarea a decurs fir probleme, va fi afigat un scurt mesaj cu date
despre versiunea Java instalat&. Dac& primigi un rispuns similar cu:
‘The name specified is not recognized as an internal
or external command, operable program or batch file.
{nseamnd ci mediul Java nu a fost corect instalat sau variabila PATH nu are ©
valoare coreet
Pentru dezinstalarea Java 2 SDK, folosi
Control Panel.
incjia Add/Remove Programs din
A.2.2 Instalarea sub Linux
Java 2 SDK ruleazi de platformele Intel Pentium sau compatible cu ker
nel Linux v2.2.12 si glibe v2.1.2-12 sau versiuni mai recente. Aveji
nevoie de minim 32 MB RAM de memorie si un spasiu liber pe hard-disk de
‘75MB. Putejiverifica versiunea curenti de g1.Lbe folosind comanda!
As /Lib/Libe-*
A.22.1 Instructiuni de instalare
Pachetul Java 2 SDK, Standard Edition, v1.4.0 este disponibil in dou for-
‘mate de instalare:
# Unfisierbinar j2edk-1_4_0-Linux-386 . bin care se autoextrage
(autodezarhiveaz’) si astfel Java 2 SDK se poate instala in orice locatie
de pe dise. Pentru aceasti metodi, consultaji sectiunea A.2.2.2;
« Figierul j2sdk-1_4_0~1inux-i386-rpm. bin care congine pachete
tip RPM(Red Hat Package Manager) cu Java 2 SDK. Pentru a instala
folosind aceast metoda, consultaji sectiunea A.2.2.3.
270[A2. INSTALAREA MEDIULULIAVA
erele pentru ambele formate de instalare sunt cuprinse in cadrul unui fisier
shell scx ipt . bin care afigeaza licenja inainte de a incepe instalarea.
A222 Instalare cu autoextragere
Pentru instalare, executayi pasii urmator:
1. Verificayi dimensiunea figierului j2sdk~1_4_0~Linux-i386.bin,
(0 dimensiune de 40618207 bytes indict © desearcare corecti a kitului
de instalare. Dacii mirimea fisierului nu corespunde celei de mai sus,
{nseamnd ci fisierul a fost deteriorat in timpul descarcirii, Singura alter
nativieste de a incerca din nou descircarea figieruluis
2. Copiaji j2sdk—1_4_0-1inux-i386.. bin ndirectoral in care dori
si instalai Java 2 SDK;
3. Rulaji 32sak-1_4_¢
chmod atx j2sdk-1_4_0-linux-i386.bin
-/J2edk-1_4_0-linux-i386.bin
Scriptul de instalare va afiga 0 licen de utlizare, dupa care, daca accep
{afi condigile expuse in licen’, Java 2 SDK se instaleaz4 in directorul
ccurent;
4. Adiugayi calea absoluti citre directorul bin rezultat in urma instalarit
(deexemplu, /usx/loca/ jdkt. 4/bin) variable’ sistem PATE. A-
‘cest lucru se poate face astfel, functie de shell-ul pe care il ut
= pentru esh sau tesh:
% set PAT
SPATH/usr/local/jdk1.4/bin)
+ pentru sh
% PATHs($PATH/usr/local/jdk1.4/bin); export SPATH
Puteji si addugayilinile anterioare la sfissitulfisirelor .pro£ile sau
eshre pentru a nu le mai scrie la fiecare login-are.
Pentru a verifica dacd instalarea a decurs fra probleme, deschideti o consold si
tastayi comanda:
java -version
2m|A2.INSTALAREA MEDIULULIAVA
acl nu au fost semnalate erori pe parcursul procesului, atunci vei vedea
tun mesaj cu detalii despre versiunea Java instalaté. Dac& primigi ispunsul:
java: Command not found
‘sau ceva similar, atunci mediul Java nu a fost bine instalat sau variabila PATH
nu are 0 valoare corecti,
A.2.2.3 Instalarea folosind RPM
1. Verificayifisicrul j25dk~1_4_0-1inux-i386—rpm. bin. Odimen-
siune de 39482030 bytes indica o descarcare corectaa kitului de instalae.
Dacit marimea fisierului nu corespunde celei de mai sus, inseamna 8
fisierul a fost deteriorat in timpul descareari, incercati din nou si dest
cali figierul respectiv;
2, Rulayi j2sdk~
4_0-Linux-i386-pm. bin folosind comenzite:
chmod atx j2sdk-1_4_0-Linux-i386-rpm.bin
-/§28dk- 1 inux-i386-rpm. bin
Scriptul va afiga o licenga de uilizare, dupa care, daca acceptajicerinjele
licenjei, vefi objine ca rezultat j2sdk-1_4_0~1inux-i386.rpm,
fisierce va fi creat in directorul curent;
3. Accesati sistemul ca root folosind comanda su gi parola acestui cont:
su - root
4 Dezinstalai J2SDK 1.4.0 Beta (in cazul in care exist aceast versiune
anterioari deja instalati pe ealeulatorul dumneavoast)
Nout: Calea implicit pentru instalarea RPM a lui J2SDK este urmi-
toarea: /usr/java/j2sdk1.4.0. Acesta este director in care au
fost instalate si pre-release'-usile versiuni 4 (in cazul in care acestea au
fostinstalte). Pentru a pregati instlarea versiunii finale, i acest director
copy todir="bin">
* include:
* properties"/>
fn acest exemplu,scopul compile copia fierce .properties (de
exempla. jnds .properties) in directonil bin gi apoi compileazs toate
clasele din drectonul sz in directonul bin, pastrind strctura de directore.
Scopullbu$ 1d depinde de scopul comp’ Le, decicdnd se lanseazi ant. build,
mai ini se executiscopul compe i dach mu apare nic oeroare se execut
Scoptl build, Scopul build aiveazi fgirele din directonal bin intro
‘thi de tp jar numiti MyComplexapp.. jar.
Prezentarea Ant din cadrul acestui paragraf este mai mult det sumari,
rolu i find doar de a vi deschide apetitul pentru procesaea automat, Mai
mule detali pute afla la adresa http: //Jakarta. apache .org/ant
276A4 Rularea unei aplicatii java
Executia unei aplicagi Java implicdexistenja (pe Hinga bibliotcile foloste
de aplicaye) unei masini virutale Java sia bibliotecilor standard (care congin
clasele java.lang.*, java-util.*, java.io. etc.). Acestea sunt
incluse in SDK-uri si JRE-uri Java Runtime Environment), Pentru a rula 0
aplicayie Java este sufcient un JRE (mediu de execuic Java) care, spre deoscbire
de SDK, mu confine utilitarele pentru dezvoltarea programelor (de exemplu,
Javac), ci doar pe cole nocesare execute lor.
Este necesar s8 clarified nigle denumiri, Pan la aparijia versiunit 1.2 a
IDK.-ului (Java Development Kit), denumires Java 2 Platform Standard Edition
(SE) nu a existat. Incepaind cu acea versiune, a apirut Java 2 Platform Stan-
dard Eston ou SDK. 1.2 (Standard Development Kit) In continuare a
SDK 1.3 i SDK 1.4 care fin tot de Java 2 Platform Standard Edition.
Revenind, pentru rulade exempla Primu1Program. class sefoloseste
comanda urmitoare, executati in directorl eurent
java PrimulProgram
AAI CLASSPATH
Bibliotecile necesare rulirii unei aplicatii (eu excepfia bibliotecilor stan-
dard) trebuie incluse in variabila sistem CLASSPATH (aga cum am descris in
parageaful A.2) sau pot fi specificate in linia de comand, folosind optiunea
“classpath .
Utlitarele din SDK folosese urmatoarea ordine pentru a cua 0 clas:
# clasele din / jre/1ib/rt . jaz,urmate apoi de clasele
din arhiva /jre/Lib/i18n. jar;
«© clasele din /jre/1ib/ext/*. jar
«© clasele din variabila CLASSPATH.
De exemplu dact este cfutati clasa MyClass din pachetul com.mypackage
si variabila CLASSPATH are valoarea
/root /work/server_upload/:/usr/local/jars/xerces. jar,
atunci figierul MyClass. class vafi clutatastfl:
1. inathivele din jre/1b;
2. indirectonul /root /work/server_upload/com/mypackage/;
27[AS DOCUMENTATIJAVA
3. imathiva /usr/local/jars/xerces. jar,subdirectorul com/my-
package/.
AS Documentatii java
Principala sursi de documentare pentru limbajul Java este siteul oficial al
‘companiei Sun Microsystems: java. sun.com,
Documentatia Java 2 Platform Standard Edition se gaseste a adresa de In-
temet: http: //java.sun.com/j2se/1.4/docs. Acolo poate fi gist
si functionalitatea bibliotecilor standard (APD),
Pentru a genera documentajii in format HTML din fisiere sursi Java, se
foloseste utilitarul javadoc,
28B. Conventii de notatie in Java. Uti-
litarul javadoc
fn Mandstire existau anumite
lar Macstrl ne- ras
Jnotdeauna aenjia asupratiranei
regulilor.
“Anthony de Mello, O clip de
ingelepciune
fnceputel injlepciuni consti in a
ddesemna obiectele eu namele lor
adecvate
Proverb chinzesexe
Femele gi pisicle vor face
Inotdeauna ceea ce vor, iar
birbafi si ini trcbuie si se
relaxeze si si se impace eu idee,
Robert Ac Heinlein
B.1_Necesitatea conventiilor de scriere a programelor
Convengile de seriere sunt foarte importante pentru programatori din mai
multe motive:
* Conform studiilor de speciaitate, 80% din costul unei aplicafii software
‘este datorat intrefineri aplicaiei respective;
2795.2, TIPURI DE PSIERE
+ Este foarte pujin probabil ca aplicagia st fe intreyinuti pe intreg parcursul
cexistenjei ei doarde citre cei care au dezvoltat-o;
# Conveniile de notajie imbunstajesc lizibilitatea codului, permitind pro-
‘gramatorilor i injeleaga codul nou mai rapid si mai profun
«# Daca aplicaja scrisi de dumneavoastri este distribuitd ca produs, trebuie
Si vi asiguragi ci este bine realizata i organizati.
Exist deci motive foarte fntemeiate pentru a utiliza convenile de seriere a pro-
‘gramelor. Probabil ci cititorii vor observa faptul ci uneori aceste convengii nu
‘au fost respectate pe parcursul lucririi, Situajia este explicabild prin faptul c&
spatiul disponibil a fost limitat,ceea ce a condus la evitarea utlizarii conven
ilor mai “costisitoare” din punct de vedere al spajiuluitipografic (de exemplu,
abundenja de comentarii javadoc). Totusi, sugestia nostri este s& nu evita
folosirea acestor convengiiin programele dumneavoastea, indiferent de marimea
sicomplexitates aplicatilor.
B.2_ Tipuri de fisiere
Java foloseste urmitoarele extensii pentru figiere:
©. Java, pentns fisiere surss
© class, pentna fisiere compilate (bytecode)
Daci exist mai multe figiere intr-un director, atunci este benefic& prezenja unui
figier README, care s& deserie conyinutul directonului,
B.3 Organizarea fisierelor sursé . java
Un fisier sursit este impuiryt pe sectiuni separate prin linii goal gi, optional,
uun comentariu ce identified fiecare secfiune. Fisierele eu peste 2.000 de linit
sant incomod de parcurs si modificat $i webuie pe cat posibil evitate. Vom
prezenta un exemplu elocvent de progeam Java formatat in mod corespunzitor
{in paragraful B.10.
Fiecare fisier sursi Java congine o singurd clasi public’ sau interfaya. Cand
clasa public& este asociaté cu alte clase sau interfeje ne-publice acestea se pot
serie in acelagifisier sursi cu clasa public, dar clasa publica trebuie si fie prima
in cadrul fsierutui.
‘Secfiunile unui figiersursi Java sunt:
2801.3. ORGANIZAREA FISIERELOR SURSA .78VR
© comentariile de inceput;
« instrucjiunile package gi import ;
© declaratile claseisi/sau interfeei
B.3.1 Comentariile de inceput
Consin informayii legate de copyright si o descriere a fsierulu.
Informatia copyright are urmatorul format standard
ra
) 4 This file contains proprietary information of
1 + Copying or reproduction without prior written
2 t approval is prohibited
© # Copyright (c) xxxex
Descrierea fisierului congine observa legate de numele figierului, functio-
nalitatea lui, modul de utilizare a claselor sau interfefelor care il compun gi alte
informayii adiionale, Comentariul trebuie si fie in stil javadoc (informa
detaliate despre utlitarul javadoc in paragraful B11):
ie
f+ File mame: Salut. java
S Description = program ce afireaza am salut de bun venit
ae in lumee Java. Contine clasele
3 t Usage : standard (eva Salut)
tt Version: 1-0
+t Dare: 15 lanuarle 2002
ta
B3.2_ Instructiunile package gi import
‘Numele pachetului trebuie si apari pe prima linie necomentat& din figieral
sursi si rebuie si respecte convengia de notare stabilitd in aceasti anexi. T-
‘mediat dupa aceasta, trebuie si apari declaratile de import ale claselor. De
exemplu:
‘package test capitoluls
Himport java awt. Graphics:
‘import java util +
28113 ORGANIZAREA PSIERELOR SURSA vA
B33 Declaratile clasei si interfetei
clastlinterfayttrebuie si fle declarattastfel (exact in aceasttordine):
1, comentariul de tip javadoc (/** */),in care se precizeaza informatii
publice despre clasi/interfat;
2, cuvamtul cheie class sau interface, urmat de numele claseis
3. optional, comentariu legat de implementarea clasei/interfejei (/* * /).
Conyine informayi private, nenecesare pentru utilitarul javadoc;
4, atributele static. Mai inti cele publ ic, apoi cele protected, cele
{irk modificatori de acces gi, in final, cele private. Evident, in catego
ria atributelorstatice intra si constantele;
‘5. atributele nestatice, in aceeasi precedentiica gi cele statice;
6, constructor clase’
7. metodele clasei. Metodele trebuie grupate din punt de vedere al func
Jionalitayi, si nu din punct de vedere al accesibilitiii. De exemplu, 0
‘metodi stack privatd s-ar putea aflaintre dou metode nestatice publice.
Scopul este de a face codul cit mai usor de citi ingeles. Fiecare metod
este precedati de o descriere precisi in format javadoc.
Documentatea este obligatorie pentru metodele publice. Metodele standard
de acces la atribute (metodele de tipul get /set) pot fi grupate firl a avea
© descriere, funcfionalitatea lor fiind binecunoscuta (modifica sau returnexzi
valoarea unui atribut al clasei). Standardul stabilit pentru descrierea metodelor
«este realizat in aga fel incdt descrierea si fie ugor de infeles. Multe elemente sunt
‘optionale gi pot fi omise, Fiecare element de pe linie incepe cu simbolul asterisk
(*) si se termina cu spajiu, Dacd un element este prezentat pe mai multe lini,
atunci fiecare linie incepdnd cu a doua trebuie indentat astfel ined fiecare line
sii fie aliniata vertical eu cea precedent,
‘Un exempl araté astfel
thee
bt edeseriere detatlara a metodel>
0
a Serplicarca tipetui de waloase returnat>
ft @exception —
+t @author Shumeleautorulul>
weCavintele @param, @return, @except ion, @author reprezinta
le recunoscute de javadoc (paragraful B.11),
Deserierea detaliat a metodei trebuie si cuprind
# rolul metodei
«© pre si post-condi
«© efecte secundare;
dependente de alte metode/clase;
ce alti metoda ar trebui si apeleze aceast metod’;
+ daci metoda trebuie sau nu si fle edefinita in clasele derivate.
Secjiunea ¢param descr tipul,clasa, constringerile tuturor argumentelor me-
todei, De exemplu:
* @param —strSursa ~ stringul de intrare
Nu poate fi de dimensiune 0
Secjiunea @return descrie valoarea retumatii de metodi: tipul de date
returnat, domeniul de valori in care se poate afla valoarea returmati gi, daci este
posibil, informaja de eroare returnati de metoda. De exemplu:
*@return returneaza un intreg din multimea 1..n.
Sectiunea excepjiiloroferi o descrierea excepiiilorpe care metoda le arunct.
De exemplu,
* @exception ResourceNotFoundException - daca resursa
nu a fost gasita.
Desi este evident, adugim un exemplu gi pentru sectiunea autor:
* @author Mihai Tonescu
B.4_ Indentarea
Codul sursi trebuie si fie indentat, folosind fab-uti si nu spatii, Indentarea
cu tab-uri are avantajul c& in aproape toate editoarele de texte se poate modi-
fica nivelul de indentare selectind dimensiunea preferati pentru caracterul ta,
Aceasta este in general seta la doua (2) spafi, dar se considera acceptabil si
tun tab de patra (4) spati.
283B.4.1 Lungimea unei linii de cod
‘Trebuie evitatelinile de cod mai lungi de 80 de caractere, pentru cf nu
pot fi tratate corect de anumite terminale si editoare. De asemenea, lniile care
aleatuiese comentariul javadoc nu trebuie si depigeascl 70 de caractere,
B.4.2_ "Ruperea" liniilor
fn siuafia in care o anumitiexpresie nu este total vizibili pe ecran (are 0
lungime prea mare, est indicat "ruperea” ei, penta ca fot cod surs si fe
viaibil, fed si fle nevoie de serol-areaorizontali a figierului. Regulile dupa
care se realizeazi aceasta operajie sunt urmatoarele:
«“rupere” dopo vinguls
«© “rupere” inaintea unui operator;
« alinierea liniei noi cu inceputul expresiei la acelasi nivel cu li
dent’;
rece:
‘© dacd lniile de cod sunt confuze, indentafiliniile noi cu 1-2 tab-uri.
De exemplu:
" mumeLungl = numeLung? + (numeLung’ + numeLungs ~ numeLungs)
zl be mumeLuag6: //ASA Da
‘numeLungl = numeLung? + (numeLung3 + oumeLungs ~
: fnomeLungS) +4 + mumeLung6; //ASA NU
B43 Acoladele
Acolada de deschidere trebuie si fie pe linia urmatoare,aliniaté vertical cu
linia precendenta. Acolada de inchidere trebuie si fe peo linieseparat aliniata
cu acolada de deschidere
Exempla:
et (conditie)
Este acceptati gi deschiderea acoladei pe aceeasi linie cu ultima instructi-
une, si inchiderea aliniaté vertical cu instrucjiunea care a deschis acolada:
284HIF Cconditien|
a
‘Alegerea uneia dintre cele dows variante este o chestiune de preferingl per-
sonali, Prima are avantajul de a creste liziblitatea, dar unii se plang e& ocup’
prea mult spafiu, Dupi cum afi observat studiind codul din aceasta Iuerare,
tori preferk si utilizeze prima variant.
B44 Spatierea
Liniile goale plasate adeevat pot imbunitii liibilitatea codului, imparyind
codul in secjiuni logice.
Douii lini vide trebuie folosite in urmioarele circumstante:
«© fntre secjiunile unui fisiersurs8;
«© intre definirile claselor si imterfejelor.
O linie vidi trebuie folositi in urmitoarele situaii:
« fintre metode;
ima sa instructiune;
+ inaintea unui comentariu de tip bloe sau a unui comentariu pe o singuri
Tinie (veri seetiunea 5.1 din prezenta anes
Spatile trebuie folosite in urmatoarele situa
+ un cuvantcheie urmat de o parantezi trebuie separat prin spajiu de aceasta
Exemplu:
wh
3
a
(tre)
‘Trebuie reyinut faptul c& spayiul nu este interpretat ca separator de care
‘compilatorul Java atunci cind se afl intre numele unei metode si paran-
teza care deschide lista de argumente a metodei;
«un spafiu trebuie si apard dupa virgul (, ) in lista de argumente;
285«© toi operatorii binari, cu excepfia punctului (.) trebuie separaji de ope~
ranzi prin spasiu. Spaile nu se folosese niciodata pentru a separa opera
torii unari si cei de incrementare/decrementare (++ /—). De exemplu:
ras (beeys (ate):
sbees
sprintSize(a, b, ¢):
+ expresiile dint-o instructiune for trebuie separate prin spajiu. De exem-
pl:
for (expr: expr2: expr3)
© operatorul de cast trebuie tot timpul urmat de spagiu:
imyMethod (byte) uaNumar, (Object) x)5
B.S Comentariile
Programele Java pot avea dou tipuri de comentari: comentarii de imple-
mentare si comentari pentru documentajie. Comentariile de implementare sunt
de tipul celor din C+#, delimitate prin /*...*/ sau //. Comentarile pentru
documentatie, cunoscute sub numele de comentarii javadoc, sunt disponibile
doar in Java si sunt delimitate de /**. . .*/. Comentariile javadoc pot fi
cextrase gi formatate fn fisiere HTML folosind aplicaja utilitard javadoc.
Comentarile de implementare adue clarificiri asupra codului sursi si sunt
adresate programatorilor care Iuereaza sau vor lucra la serierea codului. Co
mentariile de documentajie aduc clavificari asupra rolului fieciei clase, inter-
fle, metode ete. si sunt adresate celor care dorese si utilizeze clasele serise de
noi, fra afi interesayi de detaiile de implementare (codul surs8).
Comentarile conjin doar informaiirelevante pentru citiea si injelegerea
programului. in general, este bine si se evite duplicarea informajiei care este
prezentati intro forms clard in interionul codului. De asemenea, este bine si
se evite comentarii care ar putea deveni neactuale pe mésuri ce codul sursi
‘evolueaza. Pe de alté parte, comentariile nu trebuie si fie folosite in mod abuziv.
Freevenja mare a comentariilor reflecti uneori o calitate slab a codului. Dac
simaiji nevoia si comentaji foarte des codul, este cazul s& luafi in considerare
rescrierea lui pentru a-l face mai clar.
286BS. COMENTARILE
B.5.1 Comentarii de implementare
Programele pot avea patra stiluri de comentarii de implementare: in bloc,
peo singusi linie, comentarii de tip rrailing si comentari de tip sfsit de line,
# Comentari de tipul bloe
Comentarile de tipul bloc sunt folosite pentru. oferi descrier ale fisierelor,
metodelor, structurilor de date gi algoritmilor, Ele pot fi folosite la in-
ceputul fiecdnui figier si inainte de fiecare metoda. Dacii sunt folosite in
interiorul unei metode, comentarile de tipul bloc trebuie sa fie indentate
pe acelasi nivel cu eodul sursi pe care il descriu
Exemplu:
24 Acesia este un comentaria de tip bloc
Comentari pe o singur inie
‘Comentariile mai seurte pot si apara pe o singur lini, indentaté la nivelul
codului care urmeaz. Dacii nu poate fi scris pe o singuri linie, comen-
tariul trebuie transformat inte-un comentariu de tip bloe.
Exemplu:
It (conditie)
‘
> fe Trateata cazul cand conditia este adevarata. +/
© Comentarii de tipul trating
Comentarile foarte scurte pot si apari pe aceeasi linie cu codul pe care
{i descriu, dar trebuie si fie indentate mai mult pentru a le separa de cod.
‘Toate comentatiile de acest tip care apar intr-o porjiune de cod trebuie si
aibe aceeasi indentare
Exemplu:
sit (a 222)
at
5 return true: fe caz special, 2 este prim «/
“
pelue
“
+ return isPrime(a): /* verifica daca a este prime/
"1
287# Comentari de tipul sfirsit de linie
Delimitatoral // comenteazi o linie complet sau paral.
Exemplu:
81 (imyAge > 1)
a
1 exeeuta 0 operatic
B.5.2_ Comentariile de documentatie
Platforma Java oferd o aplicajie uilitar, denumiti javadoc, foarte uti-
lizatd in crearea de documenta pentru pachetele gi clasele Java. Practic, aceasti
aplicayie aimpus un standard in materie de documentare a programelor. Comen-
tariile de documentajie descriu clasele, interfefele, constructorii, metodele gi
atributele, Fiecare astfel de comentariu se giseste inte delimitatorii/**. ..*/,
cu specificatia ed existé céte un singur comentariu pentru fiecare clas, interfajd
sau membru al clase
_Exemplu de comentariu de documentatic:
thee
1+ Clasa Vehicle ofera
‘public class Vehicle
a
”
Comentarile de documentayie nu trebuie pozifionate in cadnul vreunei meto-
de sau constructor, pentru ci Java asociazii aceste comentariicu prima declarare
de metodi pe care o intilneste dupa comentariu, Aminunte despre modul de
utilizare javadoc sunt prezentate in paragraful B.11.
B.6 Declarari
B.6.1_ Numérul de declarari pe linie
Se recomandi folosirea unei singure declariri de variabilé pe o line, deoa-
rece astfel se incurajeazii comentarea linilor respective. De exemplu, varianta
Int i: // indicele sirulut
int dim; //" dimensiunea sirutui
288este preferata variantei
int i, dims
B.6.2_ Initializarea variabilelor
Este indicat ca initiaizarea variabilelor si se facd in momentul declarii
Exist situajii in care acest lucru nu este posibil, de exemplu cind valoarea
initial a variabilei depinde de anumite calcule care trebuie mai intai efectuat.
B.6.3. Locul de declarare a variabilelor
Cel mai bine este ea declarasiile variabilelor si fie realizate la inceputul
blocului in care sunt folosite (un bloc este delimitat de acolade {}), pentru a
evita posibilele confuzii de nota.
B.6.4 Declararea claselor si a interfetelor
Incarul declare clase sau interfef trbuierespecate urmitoarele regi
de formatae
© nu existi spajiu fntre numele metodei gi paranteza " (* cu care incepe
lista de paramets;
metodele sunt despiite print-olinie vids
Exemplu:
selass Test
ot
S) vold firstMethod ()
oo
eo
t yoid second Method ()
7 4
sy
28928. INSTRUCTION
B.7__ Instruet
B.7.1 _ Instructiuni simple
Pentru claritate, fiecare linie trebuie si congina cel mult o instrucjiune. Ten-
dinga generalé a progeamatorilor incepitori de a scrie mai multe instrucjiuni
Pe o singuri linie, pentu ca astfel programele si par mai “miei este puerilt
si nejustificata. Un program aersit, in care instructiunile se sueced una sub
cealalta este mult mai ugor de parcurs gi de infeles decat un program imbacsit gi
Inghesuit, chiar daca acesta este de trei oi mai scurt
sarge 445 //ASA DA
pages //ASA DA
argy +45 arge~—i //ASA MU
B.7.2_Instruetiuni compuse
Instructiunile compuse reprezinti o lista de instructiuni cupr
lade ()
« instrucjiunile compuse se indenteaza cu un
le compune:
el fay de instrucjiunea care
Vif (congitie)
st
+ instructiune_indentats_cu_un_nivel
la de deschidere trebuie si fie pe o Tinie noud aliniatt vertical cu
Tinia precedent, iar acolada de inchidere trebuie si fle pe o linie now’,
init vertical cu acolada de deschidere:
st (conditie)
f1 Malintere verticala eu instructiunea
1] Maliniere verticala cu acolada de deschidere
# acoladele trebuie folosite pent toate instructiunile, chiar gi penta o sin-
gurd instructiune, atunci cand fac parte dintr-o structur& de tipul if-else
sau Fox. Astfel este mai simplu de adaugatinstructiuni, fr% a genera ac~
Numele link-uluic /a>, afigea-
ziun link HTML
3041 UTILITARUL vavADOe
© @see pachet.clasafmembru numeLink, afgeazi un link HTML
céitre documentajia generat pentru membrul care apartine clasei din pa-
chotul specificat
@s ince afigeaza un text care indicd versiunea aplicafiel software care a prezen-
‘at pentru prima dati elementul respectiv. De exemplu, @since 1.3 denoti
faptul eX elementul a aparut in versiunea 1.3 a aplicaie.
Gversion este utilizat in general cu argumentul "8%, ¥G%", care este
convertit de javadoc in ceva similar cu "1.39, 02/28/99" (lunalzi/an),
adicd versiunea si data trecerii la versiunea respectiv.
{@link pachet.clasa#membru numeLink} se aseamini cu eti-
cheta @see, cu deosebirea ci link-ul creat nu este afigat in sectiunea See also,
javadoe -sourcepath c:\user\sre com.mypackage
-classpath listacaiClase
Este specificati calea unde javadoc va cata clasele eferite (pentru detalii
despre claselereferite, vezi secjiunile anterioare din aceasta anexa),
~Joptiune
Lanseaziicomanda java cu opfiunea specificati de argumentul opt dune.
De exemplu, pentru aflarea versiunii utilizate de javadoc, se executt co-
manda:
c:\> javadoc -J-version
Trebuie refinut faptul ci nu exist nici un spatiu intre opfiunea J si argu-
mentul opt dune.
Opfiunile prezentate anterior pot fi uilizate de javadoc indiferent de doclet-
ul folosit in generarea documentajiei. Implicit, javadoc utilizeazi doclet-ul
standard, care genereazii documentatie in format BTML. Acest doclet oferi un
alt set de opyiuni, care vine in completarea celui anterior. Tat8 citeva dintre
aceste opyiuni:
Este specificat directorul destinajie, unde javadoc va salva documentatia
HTML generatd, Dac& aceasti opyiune nu este prezenta, atunci documentatia va
fi creat in directorul curent.
~version
Include textul asociat cu eticheta @ver sion in documentayia BTML gene-
ri
-author
Include textul asociat cueticheta @aut hor in documentalia HTML generat
-splitindex
{impart alfaetic sierul de index al documenta
vial entra feeae liter.
swindowtitie text
ste specifica itl cae va plasat in tag-ul din WTI (denami-
rea feresrei browser-uli). Acest tly devine ttl ferestrei de browser, viibit
in coll din stinga sus ol fereste
~doctitie text
Este specifica ital document
-neader text
Este specificattextul care vaf plasat la inceputul fcc isier de docu-
rmentaie generat
306
in mai multe figiere, te-footer text
Este specificat textul care va apiiea in dreapta meniului de navigare din
josul paginii,
“bottom text
Este specificat textul care va apiirea la finalul fiecinuifisier generat. in ge-
neral, aceste note de subsol contin informatii legate de copyright.
-nodeprecated
Elementele demodate (pachete, clase, membrii etc.) sunt omise la generarea
documentaici.
B.11.5 Exemple
Vom prezenta in final citeva exemple simple de folosire a utilitarului java~
doc. Utilitanul poate fi rulat pe clase individuale sau pe pacheteintregi de clase.
ple de utilizare javadoc
+ Crearea documentajiei pentru unul sau mai multe pachete
Pentru a documenta un pachet, fisierele sursi din acel pacher trebuie si
‘existe intrun director cu acelasi nume ea si pachetul. Daci pachetul
este creat din mai multe nume, separate prin simbolul punet (.),flecare
rnume reprezint& un director diferit. Astfel, toate clasele din pachetul
java. awt tebuie si existe in directorul java\awt\,
Presupunem c¥ directorul c: \home\src\ java\awt\ este directorul
fn care sunt create fisierele sursi iar directorul destinajie pentru docu-
‘mentatia generat este c: \home\htm1. Vom pistra aceast conventie
pentru toate exemplele de acest gen din anexa curenti,
Documentajia se poate crea in dou’ moduri:
= din directoral corespunzitor pachetului
c:\> ed c:\home\sre
i> Javadoc -d c:\home\ntml java.awe
= din orice director:
c:\> javadoc -a
home\htm1 -sourcepath
c:\home\sre java.awt,
© Crearea documentajiei pentra una sau mai multe clase
‘Analog cazului 1, avem dou modalitaji dispon
307un, UTILITARULJavaBo
= din directorul eu figiere surst:
\> cd c:\home\sre\java\awt
c:> javadoc -d c:\home\html Canvas. java
Graphics*. java
‘Se genereaz documentajia pentru clasa Canvas $i pentru toate
clasele al c&ror nume incepe cu Graphics. Documentul HTML
‘generat nu va mai avea tri frame-urica in cazul pachetelor, ci dou
deoarece generarea s-arealizat pe clase gi nu pe pachete, situ
care al trea frame (cel cu listarea pachetelor) este inuti
= din orice director:
€:\> javadoc ~d c:\home\htm1
nome\src\ java\awt \Canvas. java
nome\src\ java\awt \Graphics*. java
© Crearea documentajiei pentru pachete si clase simultan
‘Combinarea celor dou’ cazuri descrise anterior, conduce la:
> javadoc -d c:\home\html ~sourcepath
c:\home\sre java.awt
c:\home\sre\Java\applet \Applet. java
© Crearea documenta
prin specificarea in linie de comanda a um
sier
Pentru a scurta sau simplifica o comand javadoc, se pot specifica unul
sau mai multe figiere care conjin separai nume de fisiere sursi sau pa
cchete, cite unul pe Tinie. La execugia comens
precedat de simbolul @
numele figierelor trebuie
De exemplu, fie figientl packages, cu urmatorul co
com.package1
com.package2
com.package3
Se poate rula javadoc astfel (apidocs reprezinti numele directorului
de destinatie al documentajiei generate, iar home \sr-c constituie direc-
torul in care se aflafisierul packages, dar si directorul com, cu subdi-
rectoarele packagel, package2, package3):1 UTILITARUL vavADOe
c:\> ed c:\home\sre
:> javadoc -d apidocs @packages
* Salvarea mesajelor de eroare generate de executia javado
separat (valabil doar pe Windows NT)
un fisier
Pentru a redirecta eventualele mesaje de eroare generate de execusia comen-
zii javadoc, se poate utiliza comanda:
c:\> javadoc -d docs java.lang >log.std 2>1og.err
sau, forma restransé
c:\> javadoc -d docs java.lang >javadoc.log 2>41
Prima variantd redirectioneazi mesajele standard in figierul Log. std,
iar pe cele de eroare in Log. err, in timp ce in al doilea eaz, ambele
tipuri de mesaje sunt redirectionate catre fgieral javadoc . 103.
© Utilizarea din alte programe a comenzii javadoc
Se poate folosi o secventi de cod de genul:
void metoda()
String (I javadocArguments
sourcepat!
home\ se
‘e:\home\ hemi”,
javasawt
i
‘com.sun tools javadoc. Main. main javadoeArguments )
hn Heontinuare cod
”
Dezavantajul unei astfel de utilizari este ci metoda main nu retumeazi
nimic, de aceea nu se poate determina dac& javadoc s-a executat cu
309C. Definirea pachetelor Java. Arhive
jar
‘Simpliicayilucurile att ct ete
posibil, dar nu mai mult
‘Alber Einstein
C.1_ Prezentare generali a pachetelor Java prede-
finite
Mediu de programare Java oferi o serie de clase predefinite pentru a veni
{n intimpinarea programatorilor care dorese si realizeze aplicafii la standarde
peofesionale. Scopul pentru care aceste clase au fost implementate de creator
Timbajului Java, a fost acela de a ugura pe cat posibil munca programatorilor,
‘care nu mai sunt obligaji in acest fel "si reinventeze roata", Programatori fo-
lsese aceste clase, dar isi pot defini pe baza lor si proprile lor clase, specifice
aplicailor pe care le realizeaza
Mulsimea claselor oferite de limbajul Java poarti numele de Java 2 API (Ap-
plication Programming Interface). API-ul Java ofera facilitii foarte puternice,
des utilizate de programatori. Putem spune cu certitudine cé orice program Java
utiizeaza din abundenja API-ul Java, Dat find importanga lui, este evident
8 documentajia API-ului capata si ea 0 insemnatate deosebits. Documentayia
Poarti numele Java 2 API Specification i poate fi gisita in cadrul documentajiei
SDK,
Pentru o mai bun organizare, clasele oferite de limbajul Java au fost im-
parte in pachete, avand drept criteriu de departajare funcjionalitatea oferits
Platforma Java este deosebit de solida gi ofera diverse facilitgi in diferite di-
310i, cum ar fi applet-uri, aplicajii de tip desktop folosind AWT, apli
Swing bazate pe JFC, RMI (Remote Method Invocation), securizarea aplicaji-
los, utlizarea bazelor de date, internasionalizarea aplicayilor, crearea de arhive
JAR $i ZIP, suport pentru CORBA, etc. Multitudinea de direct in care s-a dez=
voltat Java este observabila si in numarul mare de pachete pe care il pune la
ispozitia programatorilor: peste 70 de pachete. Numarul este impresionant
si devine evident faptul c’ nu putem prezenta informatii despre fiecare pachet
parte, Totus in cele ce urmeaz vom descrie cel mai des utilizate pachete,
‘impreuni cu cateva dintre cele mai reprezentative clase confinute.
Tati o listi a celor mai des ulilizate pachete (in cadrul acestei Iucriri sunt
folosite doar clase din eadnal primelor cinei pachete)
# java. Lang, care oferi clase fundamentale pentr limbajul Java;
# java.util confine clase pentru utlizarea colectiilor, pentru manevra-
rea datelor calendaristice si a timpului, pentru internajionalizarea apli-
catilor ete;
# java.io, care oferi modalitii de citie/scriere a datelor prin inter-
‘mediul fluxurilor de date, a serializiri sau a figierelor,
© java.math, care oferi clase specializate in calcul matematic;
# java. text, care oferi clase pentru manevrarea textului, a datelor ca-
Jendaristice, a timpului gi a mesajelor intr-o maniery independent de
limba utiliza, fie ea englezd, francez, romani etc.;
are pune la dispozitia programatorilor clase pentru imple-
ajiilor de rejea;
© java.net,
‘mentarea ap
# java.util. jar, care oferd clase pentni citirea si scrierea fisierelor in
format JAR (Java Archive), bazat pe formatul standard ZIP;
# java.util. zip, care ofert clase pentru cititea si scrierea de athive in
format ZIP sau GZIP.
Tati gi céteva dintre cele mai reprezentative clase pentru fecare dintre aceste
pachete:
© java.tang
~ Boolean, Byte, Character, Double, Float, Integer, Long,
Short asociate tipurilor primitive respective: byte, char, double
ete.
ai= Math, asiguri realizarea unor operaii aritmetice elementare: mo-
dalul, functittrigonometrice, exponentiale, maximul si minimul a
dou numere, aproximari ete.;
= String, StringBuffer, pentru administrarea girurilor de ca-
ractere:
= System, oferi facilitji de acces la fuxurile standard de intrare
Gin), iesire (out) si eroare (err) ete.
~ Thread, asiguri facilitafi pentru luerul cu fire de execute in Java,
# java.uti2
Calendar, pentru administrarea datelor calendaristice;
Date, reprezinti o dati calendaristict in timp, cu precizie la nivel
de miliseeunde;
Hashtable, pentru reprezentarea tabelelor de repartizare;,
LinkedL ist, pentru administrarealistelor inkinquite;
Locale, pentru reprezentarea unei zone politice, geografice sau
culturale;
ListResourceBundle, PropertyResourceBundlesai Re-
sourceBundle, pentru reprezentarea colectiilor de resurse;
format LIFO, Lastin-
= Stack, pentru administrareaunei stive list
FirstOut);
~ Vector, implementeaza un sir de obiecte de dimensiune variabill
* java.io
BufferedReader, citeste text de la un flux de intrare a datelor,
depundnd informagia cititi intr-un buffer pentru a realiza o citire
ficient a caracterelor, siurilor, stringurilor;
~ Buf fereditriter, serie text citre un flux de iesire a datelor, de
anand informajia scrisi intr-un buffer pentru a realiza 0 seriere
eficientd a caracterelor,siurilor, stringurilor;
~ File, care asigurl gestionarea figierelor, inclusiv a locatilor unde
acestea se pasesc;
~ FileInput Stream, asigur’ citirea de date sub forma unor gira
de bytes dintr-un fsier spes~ FileOutputstream, asigur scrierea de siruri de bytes intr-un
figier specificat;
* java-math
~ Bigbecimal, Bigtnteger, care permitcalcululcu numere foar-
te mari, care nu ar “incape" in reprezentarea obisnuita a numerelor
fn Java,
© java.text
= ChoiceFormat, permite atasarea de formate de mesaje in funcjie
de diverse valor ale unor variable:
= DateFormat, asigurd formatarea datelor calendaristce gi a tim-
pului int-o maniera independent de limba uilizati;
= MessageFormat, permite formatarea mesajelor independent de
mb,
= NumberFormat, permite formatarea numerelor, a procentelor gia
sumelor de bani independent de limba,
* java.net
= HttpURLConnect ion, oferi faciltii pentru conectarea prin re-
{ea laun server HTTP gi adresarea unei cereri serverului respectiv;
~ InetAddress, pentru administrarea unei adrese IP (Internet Pro-
tocol);
~ URL, pentru administrarea unei adrese URL (Uniform Resource Lo-
calor), care indied o resursa Internet
© java.util. jar
= JarF ile, pentru administrarea unui figier JAR;
= JarInputstrean, oferd facilititi de citire @ conginutului unui
figier JAR:
~ JarOutputStream, ofert facilitii de scriere a unui figier JAR.
© java-util.zip
~ 2ipPie, pentru administrarea unei athive ZIP;
313= ZipInputStrean, oferi facilitiyi de citire a conjinutului unei
athive ZIP:
~ Zipoutput Stream, ofert facilitii de scriere a unei arhive ZIP.
Dintre pachetele prezentate, dou’ se detaseaza prin gradul foarte mare de uti-
lizare, indiferent de natura aplicatici care se creaza Este vorba despre pachetele
java. lang gi java.util, Asa cum am precizat, pachetul java. lang
este importat implicit in orice aplicajie Java, drept urmare programatorul poate
folosi clasele sale fri a fi nevoie si le importe explicit,
C.2 Definirea de pachete de catre utilizator
Sectiunea de fapi prezinta un exemplu simplu, dar detaliat, de creare si uti-
lizare a propriilor pachete. Mediul de programare Java ofera spre uilizare pro-
gramatorului, o mulfime de pachete Impreuni cu clasele aferente (de exemplu,
java.util, java.math ete.). Dar pentru c& aceasti facilitate nu este in-
{otdeauna suficient, mediul Java permite definirea propriilor pachete. Cu alte
inte, programatorului Java fi este permis si igi organizeze clasele definite de
pachete proprii.
_Exemplul ales utilizeaza trei pachete:
© com. te:
© com. te:
posesori
© com.test
Primul pachet, com. test .masini, vaingloba clase cu functionalitate apropi-
aul, reprezentind diverse tipuri de masini. Asadar, vom avea clasele Dacia
si Ferrari. Al doilea packet, com. test .posesori, va cuprinde clase
‘care descriu posesorii automobilelor din primul pachet. Printre aceste clase se
numiri: Per soana, elasi asociatd unei persoane fizice si Firma, clasi aso-
iat unei persoane juridice (firme),
Programul principal, cu alte cuvinte clasa ExempluPachete, se va afla
{in pachetul com. test $i va utiliza clase din celelalte dou pachete. Pentru ci
definirea pachetelor are 0 influenti decisiva asupra locafiei unde trebuie s8 fie
salvate fisierele sursi ale acestei aplicagii de test, considerim directorul de lueru
c:\Javawork (pentru utilizatorii de Windows). Analog, utilizatoriialtorsis-
teme de operare, vor putea implementa exemplul ales, considerind un director
de lucru specific platoformei respective (/usr /Local/javawork este un
‘exemplu pentru platforma Linux).
314Citeva detalii despre pachete sunt necesae in acest moment al consti
aplicaii. In primul rind, numele pachetelrtrebuie si fie unice, entra a evita
eventualle conflict care pot si apa la incircareaclaselor. Exstenfa a dou
Pachete cu acelasi mime pune masina viral Java in situaja de a nu sti ce
clases incaree, din primal pachet sau din al doilea. Consecinja imediata este
faptul ef nu se pot crea pachete cu acelasi mume ea al pachetelorpredefinite
de medial de programare Java (de exemplu java. ang, java.util ete)
Sarcina de a gsi un ume unie penta flecare pachet poate fi usuratédack sunt
respectate convene de programare Java (detalii im anexa B), Potrvit aces-
tor conventi,putem crea pachete pornind de In domenial Internet dent, in
cazal in care programatorulfirma define un astfel de nume (de exemplu pa
chetul ro. fizmamea provine de Ia domeniol wirw, €irmamea.ro). Dac
nu exist un domenia Internet, este necesari erearea unc combinafi de mime,
care este putin probabil si se repee. Afirmafileanterioare sunt utile mai ales in
cazal in cae apicafile create de domneavoastri sunt redistribute cite divert
tilizatori, care ar putea flosi la randul lor alte pachete, del ali furnizor, Ex-
emplal nostr ind unul de est, am ales ea nume de pachet com. test, nume
care poate asgura unicitatea la niveluui caleulatonului pe care realizim apli-
cafile Java de test, desi nu este personaliat cu informafi cu caracterunic (de
exemplo, numele persoanei sa al firmei care a creat)
Namele pachetului presupune ereareauneticrarhi de directoare conforma
cul. incazul nos, cele tei pachot existent con. test, com. test .ma-
sini si com. test .posesor’, presupin erearea urmatoaelordiretoar:
com, com|test, com\test\naaini si com\test \posesorii conform
icra
1
- test
1
1
- posesori
Cele patru directoare sunt create in cadruldirectorului de lucrastbiltante-
For (c:\javawork). In fccare dintre aceste directoae se afi igierele sursi
ale claselor precizate anterior, in func de pachetal in care sunt definite:
© Dacia. java, Ferrari. java se gisese in directonul
c:\javawork\com\test\masini;
35* Persoana. java si Firma. java in directorul
c:\javawork\com\test \posesori;
© ExempluPachete. java in directorul c:\javawork\com\test.
Codul sursi al acestorfigiere este prezentat in continuare:
Listing C.1: Codul sursi al casei Dacia
171 Fiateral com\teat \masini\Decie. Java
uckage com. test -masiai
‘public class Daci
st
(fee Modelut_masinit (1310, 1300, Berlina, ete). 6/
> private String tips
fee Creaza 0 Dacie cu modelul preeizat.+/
%— publte. Dacia(String. tipal)
eo
ce tip = tipuls
Hoy
“fee Retwrneaza tipul masinit+/
© public String returneazaTip()
wf
* return tips
Listing C.2: Codul surst al clasei Ferrari
171 Fiateral com\tert\masini\ Pervert. java
package com. test masini
‘public class Ferrari
st
{1 fee Modelut masinit (P50, ete). +f
> private String tips
ee Creaza un Ferrari cu modelul precizat.+/
& publle. Ferrai
of
FE tip = tipuls
wood
(String tipul)
‘fee Returneata tipul masiall +/
© public String returneazaTip()return tip:
")
Listing C.3: Codul sursi al clasei Persoana
\77Fisieral com\resi\posesori\Persoana.java
package com. test. posesori
“Import com. test masini +:
Simport java-util-+:
Spublic class Persoana
a
+ fee Numele persoanei.+/
private Steiag mume
b /ee Adresa persoanel.+/
fh private String adresay
(ee Sir cm masinite Dacia detinute de persoana+/
‘private Vector masini:
(es Creaza 0 persoana cu numele si adresa specificate. +/
lie Persoana( String numele, String adresa_)
e ume = numele
» adresa = adresa_:
» masini = new Vector
sy
» pablic. String returneazaNume
»
ny
hes Adauga 0 masina Dacia celor aflate deja in poresic. 6/
a bite vold.adaugaDacia (Dacia. masina)
»
» masini .2dd(mesina );
a0
ew Returneaza masinile aflate in posesie.«/
public Vector returneazaMasin’ (
«ft
oy
317“)
Listing C-4: Codul sursi al casei Firma
<7 Bisieral com\ test\porerori\Firmajave
package com. test -posesori
Limport java. wtil +3
Fimport com. ‘est .masini +;
public class Firma
ut
$ fee Mumete firmet./
private String mume:
fee Mumar angafatt +
private ine numarAngsjati;
fae Sir cu masinile aflare in posesie.«/
"private Vector masini:
mie
> + Creaza o firma specificand numele si
S # mumarul de angajatt
public Firma(String numele, Int aumarulAngajatilor)
uf
a)
> (2 Adauga un Ferrari celor aflate deja in posesie.+/
h public void adaugaFerrari( Ferrari masina)
ze
2 masini .2dd(masina ):
wy
fee Returneaza mume.+/
> public String returmeazaNume()
sf
so
2 fee Returneaza masinile aflate in posesie. «/
public Vector returneazaMasini Q)
«
“oo“
Listing C.5: Utilizarea claselor din pachetele definite
77 Fisieral com\tost\ExemplaPachete Java
package com-test
‘import com. test. masini .¢;
Slmport com. test. posesori +;
Cimport java-wtil-w:
public el
“
public static vold main(String [) args)
.s ExempluPachete
Persoana p= mew Persoana("Mircea loneseu", “*)
Ee Dacia d= new Dacia ("1300");
" Mpersoana P detine masina d
” p-adaugeDacia(d)
fF Vector ¥ = p.teturneazaMasini ():
5 Wafisarea tipurilor masinilor detinute de persoana
> System-out-printin("Tipurile de masini detinute de
a 's peretueneazaNume() +": "):
for(int 180: 1 < vesize(): 144)
5 t
» String tip = (Dacia) ¥, get(i ). returneazaTip 0)
e System out-priat(tip +"):
» 1
e System. out. printin("™)s
» Firma firmaMea = new Firma( "Sun", 13000);
» Ferrari (= new Pereari(°F50"):
= “firma firmastea detine masine f
s fiemeMea.adaugaFerrari(t):
» v= firmaMes -returneazaMasini Qs
System-out. printin(*Tipurile de masini detinute de *
” + firmaMea. returneazaNume (Q) + "2"
a for(int f= 0; 1c vsize(): it)
» t
- String tip = ((Ferrari) v.get(i)).seturneazaTip ():
‘ System-out. print (tip +" "}:
20
“)
up’ ce clasele au fost create, urmatoarea actiume const in setarea vari-
319abilei de sistem CLASSPATH, prezentati in cadrul capitolului 4.4.3. Variabila
CLASSPATH trebuie astfel setaté Incdt si conjind gi directorul de Iueru pen-
tru aplicatia noastra de test. Pentru aceasta, utilizatorii de Windows execut’
uurmatoarea comand’ in cadrul unui prompt MS-DOS:
set CLASSPATH=SCLASSPATHY; c:\javawork\
Pentru a verfica daci variabila CLASSPATH a fost actualizati, se lanseaz’
{in acelasi prompt MS-DOS comanda:
echo $CLASSPATHE
Comanda afigeaza informatii aseminatoare cu cele ce urmeazi
-10:\jdk\1ib\tools. jar;
e:\javawork\
\jdk\jre\lib\re. jary
act printre locaileafgate se afd drectorul de lueru, atunci se poate trece
ta pasul urmator.
Urmatorul pas consti in compilarea claslor definite fn eadrul eelor tre
pachete care compun exemplul. Pentru ea procesul de compilare S& fie mai
ugor, se creaza un fier eu numele FisiereSursa, in directorul de Iuema
(c:\javawork), avind urmatorul confinut
com\test \ExempluPachet . java
com\test \masini\Dacia. java
com\test\masini\Ferrari. java
com\test \posesori\Persoana. java
com\test \posesori\Firma. java
Apoi, in acelagi prompt MS-DOS in care s-a setat variabila CLASSPATH,
saz figierele sursi ale aplicajiei test, utilizand din directorul de luenu
comands:
javac @fisieresursa
Este foarte important ca toate comenzie i fe execatate tn acelagi prompt
MS-DOS in cae sa sett variabila CLASSPATA, penta ch aceasti stare este
valabili doar in cadralacelui prompt. in momentul tn care promptl respec
Liv este inchs, se pieede modificarea realizata asupra variabilei CLASSPATH,
revenindu-se la valoare iia. Pentru a face aceste modificii permanente,
cle trebue sie efectoate in
320« figienl autoexec.bat din directonul ridding, in cazulsistemelor Win-
dows 95, 98, ME, urmate de repornirea calculatoral
© sectiunea User Variables din Control Panel-> System->
Environment, in cazul sistemelor Windows NT, 2000,
Deoarece numarul de figiere sursi este destul de mic pentru acest exemplu,folo-
sirea comenzii anterioare este acceptabili. Dar, daci aplicatia pe care orealizati
are un numar mare de clase, atunci este recomandat si utilizai utilitarul ant,
prezentat in anexa A, pentru a compila figiercle aflate int-o ierarhie de ditec-
Prin compilate, se creaza figierele .class respective, in cadrul acelorasi
ditectoare cu cele sursi, Dacit se doreste separarea fisierelor sursi de cele
-class, alunci comanda javac trebuie folositi cu opfiunea ~d, urmati de
irectorul unde vor fi create fisierele . class. Trebuie menjionat c& acest now
director nu este automat precizat in variabila CLASSPATH. De aceea, dacd op-
afi pentra aceasta variant, va trebui si adiugayi personal directorul respectiv
{in cadrul variabilei CLASSPATE.
[Exemplul construt in aceasta secjiune se executd prin nularea in directorul
de lueru a comenzii
Java com.test .ExempluPachet
Rezultatele afsate sunt:
Tipurile de masini Dacia detinute de Mircea Tonescu:
1300
Tipurile de masini Ferrari detinute de Sun
F50
Pentru a injelege in profunzime modul de Iueru eu pachete, si vedem eum
‘pisos Java pachetele si clase definite de programator. Mai nti, interpretorul
Java (Java) cautk variabila de sistem CLASSPATH. Pornind de la ridicini,
interpretoral preia, pe nd, fiecare nume de pachet si inlocuiestefiecare sim-
bol". intalnit eu simbolul *\* sau "/® in functe de sistemul de operare
pe care ruleaza, pentra a genera o cale relativis unde vor fi ciutate fsieele
class. in cazul nostru, pachetal com.test .masins este transformat in
com\test\masini. Apoi, aceasti cale relativi este concatenat la diferitele
inteisi din variabila de sistem CLASSPATH, de exemplu c:\Javawork sau
\jdk\Lib\tools. jarete. Fiecare dintreaceste concatenar mu reprezin-
aliceva decatc8i absolute, unde interretorul cautafgierele «class (adic&
321Dacia.class, Ferrari.class). Pentru exemplul nostry, interpretorul
‘pisos fisierle anteioare in directorul :\javawork\com\test\masini,
fn acest moment se poste spune ci primele pachete realizate de dumnes-
voastel sunt functionale. Exemplul ales a fost isi unul simpla pentra a putea
{njelege pasii necesari de a erearea pachetelor si pina la rularea api
le foloseste. Cu siguranfa cd de-a lungul timpului nu v8 vey. opi aici si acest,
exemplu va fi urmat de altele, conjinnd ierarii de pachete din ce in ce mai
complexe,
C3 Arhive jar (Java ARel
es)
Athivele jax permit gruparea mai multor fisiereintr-un sigur fisierarhivat.
{in mod obignuitfisierele conyinute de o arhiva jar sunt fisiere .class, impr
uni cu diverse resurse care pot fi asociate cu o aplicajie (imagini, etc). Nu exist
© interdicjie in ceea ce priveste tipul de fisiere confinute de o arhiv8 ar (aces-
tea pot confine orice tip de figiere, ca de altfel orice alt format de arhivare, cum
arfi zip, rar, ace, ar etc.) darin general sunt folositefisierele .class.
Athivele jar oferi programatorilor anumite benefici:
© compresie: athivele jax permit compresarea fisirelor pentru a fi stocate
mai eficient;
© simplificarea distribuirit aplicaiilor: aplicatia creat este distribuithcli-
ceniilor sub forma unui singurfisier jax, care inglobeaza toate fisierele gi
resursele necesare funcional aplicai
© micsorarea timpului de transfer: pentea a fi descircate fisierele confinute
de un fisier jar, este nevoie doar de o singuri conexiune HTTP si nu de
cite o conexiune pentru flecare figier in parte;
© portabilirate: ca parte a platformei Java, arhivele jax sunt portable,
putnd fi utiizate Prd a fi modificate pe orice platforms cu suport Java;
© extinderea functionalitayit plarformei Java: mecanismul de extindere o-
ferit de platforma Java permite extinderea funcyionalitafii platformei prin
adiugarea unor fisiere jar celor existente (printre arhivele existente in
orice implementare Java se numéri gi rt. jar, ce confine API-ul Java
predefinit, adic’ toatl ierarhia de clase pe care mediul Java o ofers spre
utilizare programatorilor) Prin adugarea unor arhive noi, putefis& extin-
‘defi functionalitatea platformei Java. Un exemplu este extensia JavaMail,
322LUAVA ARCHIVES)
dezvoltaté de Sun, care reprezint& un API uilizat in programele Java pen-
‘ru transmiterea si recepfionarea de email-uri:
«© versionarea pachetelor de clase: un fisiet jaz poate cuprinde date despre
figierele pe care le confine, cum ar fi informayii despre cel care a creat
pachetele gi despre versiunea pachetelor respective.
3.1 Utilizarea figierelor . jar
Fisierele jar sunt athivate pe baza formatului zip, deci au aceleagi faci-
Titi ca orice alt tip de arhiva (compresie fara pierderea dateloretc.). Pe lang
aceste facilitaji de bazd, figierele jar au gi alte funcfionalitai mai avansate
(rulatea unei aplicagii in format jar este una dintre ele), a ctor injelegere
este condiionata de familiarizarea cu operatile fundamentale cu arhive jar:
crearea unei arhive jar, vizualizarea, extragerea sau modificarea conjinutulut
acest
Operatile de bazi cu arhivele } ax se realizea7i folosind o aplicajie utiitars
oferiti de platforma Java. Aceast& aplicaie utilitaré este in linie de comand’
sieste denumiti jar, putind f gist in directorul bin al distribugiei Java
instalati pe calculatorul dumneavoastri, Pentru a testa prezenja utiitarului pe
calculatorul dumneavoaste’, deschidejio fereastrit de comand (sau, altfel spus,
tun prompt) si rulaji comanda jax. Implicit, vor fi afigate informaii ajutatoare
despre aceasti comands, cum ar fi opfiunile de utlizare gi cAteva exemple.
Tati, pentru inceput, un rezumat al celor mai frecvente operafii cu arhive
jar’
‘© crearea unei arhive jar (cu alte cuvinte, “impachetarea” figierelor gi a di-
rectoarelor int-un singur fisier);
© vizualizarea conjinutului unei athive jaz;
+ extragerea confinutului unei arhive
© extragerea doar a anumitorfisiere conginute intr-o ar
# modificarea conjinutului unei arhive Jar;
« rularea unei aplicagii"impachetate” int-o arhiva Jar;
C32. Crearea unui fisier . jar
athiva jar este realizaté utilizind aplicatia utilitard jar in urmitoarea
forma:
323(6. ARKIVE YAR UAVA ARCHIVES)
jar cf nume_fisier_jar nume_fisiere
Optiunile si argumentele utiizate in aceasta comanda au urmatoarea sem-
nificat
© opfiunea c indict faptul cd este create o arhiv jar;
«© opfiunea £ indict faptul cX arhiva este creat intr-un figier. Este important
de rejinut faptul c& optiunile nu trebuie separate prin spatiu si c& ordinea
de aparitie a lor nu conteazi,
«© argumentul nume_fisier_jar reprezinté numelefisierului jaz rezuk-
tat in urma arhivari, Poate fi folosit orice nume pentru a denumi un fisier
ar. Prin conventic fgierele au extensia . jar, desi acest lucra nu este
obligatoriu;
‘© argumentul nume_fisiere reprezintao listé de nume de figiere gi di-
rectoare, separate prin spafiu, care vor fi introduse in arhiva. Numele
acestora poate si confina si simbolul *, pentru a face referire Ia mai
multe figiere in acelasi timp. In cazul ditectoarelor, conjinutul acestora
‘este addugat recurs Ia arhivas
‘Suplimentar, se pot folosis1 alte opfiuni, pe langd cele de bazi (cf):
© opfiunea v afigeaz’t numele fiectirui fisier adaugat Ia arhiva, in timpul
crear acesteia;
«© opfiunea 0 indicd faptul cd arhiva nu va fl compresatt;
* optiunea M indica faptul ca figieral manifest asociat arhivei nu este creat
(detalii despre fisierele manifest sunt oferite mai tarzi in cadrul sectiunii
‘curente);
+ opfiunea m indica faptalc& pot fi preluate dintr-un figier manifest existent
informatii necesare arhivei care va fi creat. in acest caz, comanda are
uurmitoarea form’:
jar cfm nume_fisier_manifest nume_fisier_jar
nume_fisiere
«# opfiunea ~C schimba directorul curent in timpul execu
3243. ARV
LUAVA ARCHIVES)
{in continuare vom prezenta citeva exemple de creare a athivelor jaz, care uti-
lizeaza figirele .cLass ale aplicajci de test cu masini si posesori, prezentata
{n subeapitolul precedent. Aceste fisiere se aft conform calor stabilite in sub-
‘apitolul precedent, in directorul c: \avawork, cae are urmatoarea struct
(pentru simplitate, sugerim mutarea celorlalte tipuri de fisere in alt director}
~ test
~ Dacia.class
~ Ferrari.class
= posesori
- Firma.class
~ Persoana.class
~ ExempluPachete.class
fn prim exemplu de create a arhivelor jaz, in director ¢:\Javawork
se lanseazi dintr-o fereasri de comands aplicajia ja att
Jaz evf pachete. jar com
{n fereastra de comanda se va vedea ceva asemanator cu textul urmitor:
added manifest
adding: com/(in = 0) (out= 0) (stored 0%)
adding: com/test/(in = 0) (out= 0) (stored 08)
adding: com/test/masini/(in = 0) (out= 0) (stored 0%)
adding: com/test/masini/Dacia.class(in = 364)
(out= 257) (deflated 29%)
adding: com/test /masini/Ferrari.class(in = 368)
259) (deflated 298)
com/test/posesori/(in = 0) (out= 0) (stored 0%)
com/test /posesori/Persoana.class(in = 738)
432) (deflated 41%)
adding: com/test/posesori/Firma.class(in = 730)
(out= 439) (deflated 39%)
adding: com/test/ExempluPachete.class(in = 1602)
(out= 913) (deflated 43%)
Deoarece com este un director, utilitarul jar a adaugat recursiv toate di
rectoatele si fisierele confinute in el. Rezultatul execusiei acestei comenzi este
325(6. ARKIVE YAR UAVA ARCHIVES)
figieral pachete. jar, aflat in directonul curent, in care a fost lansatt co-
‘manda, Analizand textul afigat se poate observa ca fisierul proaspit creat este
‘comprimat.
Exista si posibilitatea de a crea 0 arhivi pachete. jaz necomprimati,
Pentru aceasta se lanseazi comanda:
jar cv£0 pachetel. jar com
‘Aceastaafigeaz urmatorul text
added manifest
adding: com/(in = 0) (out= 0) (stored 0%)
adding: com/test/(in = 0) (out= 0) (stored 08)
adding: com/test/masini/(in = 0) (out= 0) (stored 08)
adding: com/test/masini/Dacia.class(in = 364)
{out= 364) (stored 0%)
adding: com/test/masini/Ferrari.class(in = 368)
368) (stored 0%)
com/test/poses
com/test /poses
738) (stored 0%)
adding: com/test/posesori/Firma.class(in = 730)
(out= 730) (stored 08)
adding: com/test/ExempluPachete.class(in = 1602)
(out= 1602) (stored 0%)
/(Gin = 0) (out= 0) (stored 0%)
/Persoana.class(in = 738)
‘Am ales si dim o alti denumire arhivei din al doilea exemplu, pentru a
putea compara dimensiunile celor dou fisiere jaz rezultate, Daci cel com-
primat, denumit pachete. jar, are 3.792 de bytes, cel necomprimat,
pachetel. jar,are 5.180 de bytes.
uteji si cteajio athivi jaz folosind simbolul *, cain exemplul urmator:
jar cvE pachete.jar *
‘Cu ajutorul acestui simbol sunt adaugate in athiva toate fisierele gi (recursiv)
directoarele din directorul curent.
Ultimul exemplu pe care il prezentim foloseste optiunea ~C, de schimbare
‘a directorului curent, Prin utilizarea acestei opfiuni, cde relative nu mai sunt
plstrate in totalitate in cadrul fisirului jaz. Pentru a observa acest comporta-
‘ment al utilitarului jar, lansaji comanda:
jar cvE pachete. jar -C com\test\
326LUAVA ARCHIVES)
fn fereastra de comands se va afga:
added manife:
adding: masini/(in = 0) (out= 0) (stored 08)
adding: masini/Dacia.class(in = 364) (out= 257)
(deflated 29%)
adding: masini/Ferrari.class(in
(deflated 29%)
adding: posesori/(in = 0) (out= 0) (stored 08)
adding: posesori/Persoana.class(in = 738) (out= 432)
(deflated 41%)
adding: posesori/Firma.class(in = 730) (out= 439)
(deflated 39%)
adding: ExempluPachete.class(in = 1602) (ou
(deflated 43%)
368) (out= 259)
913)
Cu alte cuvinte, in timpul execufiei comenzii directonul curent a fost schim-
bat in com\test, iar fgierele gi directoarele au fost adiugate ca si cum co-
‘manda ar fi fost executati in acel director. Usilitatea acestei opfiuni apare in
‘momentul in care se adaugi mai multe fisiete gi directoare lao athivi, deoarece
atunci se poate schimba dinamic, dintr-o singura comand, director! curent de
‘execufie a utilitarului jar:
C
3 Vigualizarea continutului unui figier . jar
Conyinutul unui fisier jax poate fi vizualizat far a-l extrage propriu-zis
din interiorul fisierului, Comanda standard utilizat pentru a realiza acest lucru
este:
jar té nume_fisier_jar
COptiunile si argumentele utilizate de aceasti comand’ au urmitoarea sem-
nifcayie:
© optiunea t indica faptal cd se doreste vizualizarea confinutului unui figier
jazi
«© opfiunea £ indica faptul c& in linia de comands va fi specificat un nume
4e figier, al carui conyinut va fi afigat;
© argumentul nume_t
ccinui conyinut va fi afigat.
x_jar reprezint& numele fisierului jar al
327(6. ARKIVE YAR UAVA ARCHIVES)
Suplimentar, se poate utiliza si opjiunea v pentru a objine informayii despre
imensiunea fisicrelor ear intra in componenja athivei jax si datain momentul
ultimei modifica la care au fost supuse.
‘Ca exemplu, lansaji in director c:\javaworrk urmatoarea comanda pen-
tna a vedea care este conjinutul athivei pachete. jar, creat la sectiunea an-
terioara(primul exemplu din suit)
jar tf pachete. jar
Rezultatul executiei acestei comenzi este urmatorul:
META-INF/
META-INF /MANIFEST.ME
com/
com/test/
con/test /masini/
com/test /masini/Dacia.class
con/test /masini/Ferrari.class
com/test /posesori/
com/test /posesori/Persoana.class
com/test /posesori/Firma.class
con/test /ExempluPachete.class
Dupa cum se poate observa, este afigatfiecare director gi figier conjinut
fisieral jar. Directorul META-INF gi fiers MANIFEST.ME, conjinut in
acest director, reprezinté o componenti special a oricirui fier jar (paragre
ful C35), flind plasate in fisier Ia momentul credrié acestuia. De asemenea,
este util de refinut c& toate directoarele gi figirele listate au edi relative, de tipul
celei de mai jos: com/test /masini /Dacia.class.
3.4 Extragerea continutului unui figier . jar
Forma standard a comenzii cu ajutorul cireia se extrage conjinutul unui
fisier jar este urmatoarea
jar xf nume_fisier_jar [nume_fisiere_arhivate]
COpfiunile si argumenteleutiizate au semnificayia:
© opfiunea x indicd faptul c& este extras conginutul unui fsier jars
«© opfiunea £ specifica faptul 8 fisierul jax al c&rui conginut va fi extras,
este specificat in linie de comand,
3283. ARV
LUAVA ARCHIVES)
‘© argumentul nume_fisier_jar reprezinti numele figierului al c&rui
‘conginut va fi extras;
‘© argumentul nume_£isiere_arhivate esteun argument optional (mo-
tiv pentru care apare inte caracterele { ]), reprezentind lista cu numele
figierelor care vor fi extrase din figierul jaz, separate prin spayiu. Dact
argumentul lipseste, atunci va fi extras intreg conginutul fisierului jar.
‘Cind extrage conjinutul unui figier jaz, utilitaral jax creazd copii ale igerelor
si directoarelor care sunt extras, reproduedind structura de directoare pe care
fisicrele au in eadrul athivei. Toate aceste copii sunt create in directorulcurent,
fisirul jax rminind intact. ins, dacd exist fisiere cu acelagi nume in direc
tonal curent, ele vor fi escrse.
Ca exemplu, sh extragem conjinutularhivei pachete . jar. Pentru aceasta,
‘executajicomanda urmatoare din directorul ¢: \javawork, intro fereastri de
‘comands:
jar xf pachete. jar
Rezultatul execusici acestei comenzi sunt cele doud directoare conginute in
arhiva, impreuna cu subdirectoarele si figierele pe care le congin. Aceste direc-
toare sunt com, unde se aflé clasele aplicatiei de test, si META~INF, unde se
giseste figieral MANIFEST.MP. Dupa cum se observa, toate figierele gi direc-
toarele conjinute au fost extrase, iar figiensl pachete.. jar a rimas intact.
Pentru aextrage doar anumitefigiere din arhiva jar, trebuie si Ie specifica
‘comanda:
‘ca argument. Ca exempla, execut
jar xf pachete. jar com/test/posesori/Firma.class
‘Aceast comanda creaza ierathia de directoare com/test /posesori,
cama in care nu exist in directorul curent, si apoi creaziio copie a fisierului
Firma. class in directonl posesori.
3.5. Fisierul manifest al unei arhive jar
Fisicrul manifest este un fisier special al unei arhive jaz, care congine in-
formayii despre fisierele arhivate. Implicit, fgierul are numele MANIFEST .MF.
Crearea unei arhive jar presupune, implicit, crearea unui fisier manifest,
asociat cu respectiva arhiva. Fiecare arhiva Jar are un singur figier manifest,
‘care este automat creat in directorul META-LNF al arhivei. Numele figiera-
lui manifest si al directorutui in care se afld acesta, nu pot fi modificate, deci
{ntotdeauna fisierul manifest are locajia META~INF /MANIFEST.MP,
329,(C3 ARKIVE YAR UAVA ARCHIVES)
Informayile conjinute intr-un figier manifest sunt de tipul "cheie: valoare”.
De exempla, fisicrul manifest al ahivei pachete . jar are urmatorul conyinut:
Manifest-Version: 1.0
Created-sy: 1.4.0 (Sun Microsystems Inc.)
Fisiorul manifest conjine doui informajii despre athiva pachete. jar:
versiunea fisierului manifest (specificati de cheia Manigest-Version) si
‘numele platformei Java care a creat figierul manifest respectiv (specificat de
cheia Created-By)
‘Acesta este formatul standard al unui fisier manifest asociat unei arhive
jar. Informayiile pe care le ofera diferd insi de Ia o arhiva la alta, in functie
Ge scopul athivei, Cu alte cuvinte, pe Kinga acestea mai pot apare si altele,
‘care vor fi prezentate in continuare. Daca rolul pe care il are athiva jar este
doar cel standard al unei arhive, cum ar fi compresia datelor, nu trebuie si va
faceji probleme in legiturl cu fisierul manifest, pentru ci fisierul manifest nu
are nici un rol in astfel de situafii. Dac’, insi, doriji ca arhiva jar si prezin-
te functionalitgi speciale (avansate), atunci va trebui sii modificali conjinutul
fisierului manifest, dar pentru aceasta mai intdi va trebui si cunoagteti ce tre-
buie modificat in figierul manifest si, dupa aceea, cum trebuie si-1 modifica
Pentru ca o aplicatie "impachetata" inten figier jax, si poati fi executati
folosind acest format, este necesar’ specificarea "punctului de intrare” al apli-
cafiei, adicd numele clasei in care se afl metoda main (), care este apelata in
‘azul in care aplicajia nu este arhivat
Specificarea numelui cla
Class. Pentru aplicajia noastra de test, informatia ara ast:
Main-Class: com.test .ExempluPachete
acd aplicafia dumneavoastra utilizeaza clase disponibile in alte arhive jar,
atunci trebuie specificat acest lucru prin intermediul cheii Class~Path, Desi
{in cazul aplicajiei noastre nu se folosese clase din alte arhive ar, iat un ex-
‘emplu de prezentare a acestei informajii
Class-Path: test2.jar app/test3. jar
Pentru a refine informayiireferitoare la versiunea pachetelor consinute intr-
© athiva jar, se pot utiliza chei speciale. Iatd un exemplu, adaplat la datele
cexistente in aplicafia noastr
Name: com/test/masini
3303. ARV
LUAVA ARCHIVES)
Specification-Title: "Clase de masini"
Specification-Version: "1.0"
Specification-Vendor: "X Software"
Implementation-Title: "com.test.masini*
Implementation-Version: "versiune de test 0.12"
Implementation-Vendor: "X Software”
Un astfel de set de informatii poate fi prezentat pentru fiecare pachet al
aplicatici
3.6 Modificarea fisierului manifest al unei arhive jar
‘Modificarea fisierului manifest al unei arhive jax se realizeazi prin inter-
‘mediul opfiunii m pe care o oferd utilitarul jar. Opjiunea m permite adaigarea
{in fisioral manifesta informaiilor dorte, in timpul operasiei de create a arhivei
jar,
Formatul standard al comenzii est:
jar cfm nume_fisier_manifest nume_fisier_jar
nume_fisiere
‘Dat fiind faptul c& prin aceasta comands se ereaza un fisier jar, opji
cf si argumentele nume_fisier_jar si nume_fisiere au aceeasi sem-
nificaje cu cea descrist la sectiunea de creare a unui figier jar. Prin urmare,
singurele lucruri care mai trebuie precizate sunt:
© optiunea m specific faptul ed se vor addiuga anumit
‘manifest creat automat la erearea unei arhive jar;
«© argumentul nume_fisier_mani fest reprezintd numele fisierulu
‘care vor fi preluate informatile care vor fi adaugate in fisierul manifest.
Ca exemplu, vom recrea athiva pachete.. jar, adiugind fisierului manifest
citevainformajiicu caracter special, Astfel, in directorul curent, c:\javawork,
se creazi un fisier cu numele info . txt, avnd urmitorul continu:
Main-Class: com.test .ExempluPachete
Name: com/test/masini
Speci£ication-Title: "Clase de masini"
Specification-Version: "1.0"
Specification-Vendor: "CompaniaMea”
2331(C3 ARKIVE YAR UAVA ARCHIVES)
Implementation-Title: "com.test-masini*
Implementation-Version: "versiune de test 0.12"
Implementation-Vendor: "X Software"
‘Dupaice figierul este salvat, se executa comanda:
Jar omf info.txt pachete. jar com
Rezultatul execusiei acestei comenzi este arhiva pachete. jar. Pentru a
vedea modificirile efectuate in figieru! manifest, extrageti acest fgier din athiva,
Figienul ar trebui si arate astfe
Manifest-Version: 1.0
Main-Class: com.test .ExempluPachete
Created-sy: 1.4.0 (Sun Microsystems Inc.)
Name: com/test /masini
Specification-Title: "Clase de masini*
Specification-Vendor: "X Software"
Implementation-Vendor: "x Software"
Specification-Version: "1.0"
Implementation-Version: "versiune de test 0.12"
Implementation-Title: "com.test.masini*
Se observa ci noul fisier manifest este © combinatie intre fisierul standard
‘reat de utiliarul jar gifgieral info. txt.
C37 Modificarea confinutului unui fisier . jax
‘Conyinutul unui fisier jax poate fi modifica folosind optiunea w a utilitaru-
lui jar. Prin modificarea conjinutului unui figier jar se poate injelege atat
‘modificarea fisierului manifest asociat arhivei jax, cét si adiugarea unor noi
figiore fn athiva jar.
Forma standard a comen:
este:
jar uf nume_fisier_jar nume_fisiere
COptiunile si argumenteleutilizate au urmatoarea semnificajie:
© optiunea u semnificd faptul c& arhiva jar va fi modificata
«© opfiunea £ specific’ faptul c& numele fisierului care va fi modificat este
precizat in linie de comand;
332es atv i uava avs
‘© argumentul nume_fisier_jar reprezint numele fisierului care este
modificat (actualizat);
«© argumentul nume_£isiere reprezinti o listi de fisiere ce vor fi adau-
gate in arhiva,
Daca se utilizeazit opjiumea m (aseminator cu sectiunea anterioars, de modifi-
‘care a figicrului manifest) atunci se poate modifica figieral manifest ala
jar, concomitent cu adiugarea unor noi fisiere in arhiva Sar
acd, de exemplu, se doreste adiugarea in arhiva pachete . jar a unui
nou fisier new. gf, aflat in directorul curent,atunci se executé comanda:
jar uf pachete.jar new.gif
De asemenea, se poate modifica fisierul manifest al arhivei pachete. jar,
prin execujia urmitoarei comenzi (figienul info. txt este cel definit la secti-
uunea anterioara):
jar umf info.txt pachete. jar
C38 Rularea aplicafiilor Java "impachetate” intr-o arhiva
jar
Aplicai
‘comands
ccare sunt arhivate in cadrul unui fisier jax pot fi rulate folosind
java ~jar nume_fisier_jar
Optiunea —jar specifica faptul ca aplicatia ce va fi rulata este continut:
o athiva jar. Accastcomanda poate fi tilizaté doar dac i iieral manifest
al arhivei jar este speciticat ‘punctl de intrare" al aplicajc,prin intermedi
cheit Nain-Class. fn consecinga, penta a putea rua o apicaic coninutd
intro arhiva jar, trebuie mai inti si modifica sina manifest pens a in-
trode informatia cert
fn exemplul nostra, odata ce valoarea chetiain~Class este specifica,
se poate rua aplicayia tlizind comanda
java jar pachete. jar
Rezultatul executiei acestei comenzi este urmitorul:
333(C3 ARKIVE YAR UAVA ARCHIVES)
Tipurile de masini Dacia detinute de Mircea Ionescu:
1300
Tipurile de masini Ferrari detinute de Sun:
50
fn concluzie, setiunea destinai arivelor Jax prezinté modalitatea de «
realiza opera de baz cu arhive jaz, precum si modalitatea de a rlaaplicatit
conginute fa cadeulunei astfel de arive, infigind acestecaracterstit int
‘an mod simplu, la obiec, pln de exemple elocvente, pentru ca programatorul
‘5% poat surprinde faciityie putemice pe cae le ofera acestearhivespeciice
platforme: Java.
334D. Internationalizarea aplicatiilor.
Colectii de resurse
Pentru un birbatcurajs, flecare
(ar reprezint o pare.
Proverb grecese
[Lumea in care trkim este mick si inde i devini din ce in ce mai mick pe
zi ce rece. in mare misura, aesta este rezultatl implicit computerelo in vi-
aa noastrd. Internal a devent tn ui ani principalul mjloc de comunicare
{inte oameni, pentr cd oferi o modalitate foarte simp si rapid de comuni-
care, Email sau navigara pe Internet nu mai repezintio necunoscata penta
Imajortateadintre noi. Practc, putem spune cd trim intr-un imens sat, n care
fiecare poate comunica simply gi rapid cu cela, Efectl globaliari se simte
sin industria IT, unde programatoi tebuie si considere ca pasa de desfacere
fnweaga planeta. Ei sunt nevoiti si dezvolteaplicait care pot ft uilizate din
Los Angeles pin Ia Pari, fri ca acest lems sa implice un efort prea mare de
programare. Cu alte cavine,sarcina lor este de «crea aplicai interationali-
zate, Din acest punet de vedere, programatori Java pots fe lini, J2SDK
oferi ointreaga ierathie de clase care permite adaplarea un aplicaji de lao
limbafculturé a alta, cu un efor minim de implementare. in Java, rocesul este
chiar mai simpla decd pare
D.1_ Timpul, numerele si datele calendaristice
Este foarte bine cunoscut faptul ci, datoriti diverselor popoare si culturi
existente pe planeta noastri, nu existé un standard acceptat la scar planetarit
pentru afigarea numerelor, a datelor calendaristice sau a timpului
335J, TIMPUL, NUMERELE DATELE CALENDARISTICE
‘S& lum ca exemplu urmatoarea dat: 5/3/02, Pentru cei ce locuiese in
Statele Unite, aceasta dati reprezinta data de 3 mai 2002, in timp ce pentru cei
ce locuiese in Europa, aceasta reprezinti $ martie 2002. Dupai cum se poste
‘observa, modul in care componentele unei date (zi, lund, an) sunt combinate gi
diferd de lao {ara la alta. In Statele Unite, formatul este in stilul luni/zvan, in
timp ce in majoritatea gérilor din Europa formatul este zi/luni/an. Poate c& nu
este o diferent mare, dar nu trebuie subestimata importaniaei pentru utilizatorii
aplicatiior.
Formatele de date sunt poate cele mai simple, Ce se poate spune despre
formatele de reprezentare a timpului sau cele de reprezentare a sumelor de bani
(formate monetare) sau a numerelor? Rispunsul va fi descoperit pe parcursul
‘acestei secfiuni a anexei
Convenile de formate variazi de lao {ari la alta, uneori semnificativ. Ex-
luafi in care aceste convenfii variaz’ chiar si in interiorul aceleasi fr
teva exemple:
ist
Tati
© Timpal
Afisarea orelor, minutelor si secundelor pare si fie cea mai simpli din-
tre sarcini, dar nu este aga. Diferenfe apar de exemplu la caractenul de
separare a orelor de minute. Unele {ati folosese simbolul “ :" (21:13
PM), in timp ce altele (Italia etc.) folosese simbolul “.” (23.13). De
asemenea, cele 24 de ore ale zilei pot fi reprezentate ca jumitii de zi de
cite 12 ore (primul exemplu), sau cu ore cuprinse intre 0 gi 24 (al doilea
cexemplu);
© Datele calendaristice
Exemplele anterioare au aritat eX pozifia zilei, a lunii si a anului into
reprezentare de dati calendaristicl diferd de Ia 0 zoni la alta. Pe de alti
parte, caracterul de separare diferd gi el de la “/”" in Statele Unite (de
‘exemplu, 5/3/02), la“. in Germania (de exemplu, 03.05.02). De
asemenea, numele zilelor gi ale lunilor diferi de lao limba la alta;
© Numerele
Primul lucru care atrage atengia in cazul numerelor este separatorul zeci-
mal. Statele Unite folosese simbolul “ .” (de exemplu, 3. 55), dar alte
iri (Romania ete.) preferd simbolul “, "(de exemplu 3, 55). Pentru
1 imbunitii citirea numerelor mai mari, cifrele sunt grupate de obicei,
objinandu-se mii, milioane, miliarde etc. in Statele Unite acest sim-
bol este “, ” (de exemplu, 3, 403.45), iar in alte féri (Romania ete.)
acest simbol este “.” (de exemplu, 3. 403, 45). Sumele de bani suntil TIMPUL, NUMERELE §!DATELE CALENDARISTICE
reprezentate de asemenea di
nul $ folosit de Statele Unite gi alte {&ri (de exemplu, $3, 400.00), dar
cexisti numeroase alte alternative.
De la lansarea ei, Java a fost catalogatldrept solujia dezvoltsi de apliayiin-
temajjonalzate, Dar pnd la apaifa JDK. 1, suportul penta internafionalizare
a fost redus, incepand isi cu versiunea anterior aminttd, Suna inclus in dis-
tribusia IDK pachetul java. text care confine clasele gi interfejele pentms
‘manevrarea textuui in formate locale specificediverselor cultur
fnainte de a prezenta soluja Java pent tratarea stuafiloranterioare, est
azul si prezentim noyiunea de localizare (engl. locale) si clasa Java asociat,
Locale.
© localizare poate desemna o regiune cultural, politic sau geograicl. De
‘exemplu, poate fi consideratkregiunea din eare provine un grup de persoane
care vorbese aceeasi limb. Din acest motv, lima vorbitd de aceste persoane
este important pentru o localizare. Nafionaltatea de asemenea, pent c8, de
‘exemplu, desi american si britaniti vorbese aceeagi Himba, ei au tous iden-
‘tii cultural dierte,
in Java, ocalizarea este reprezentattprint- instant a clasei Locale din
pachetul java.util, O instant aclasei Locale poate fi ereaté pentru orice
limba i otic jar. Localizarea se ereazi pe baza numelorlimbii a fri pentra
care se realizeaz8respectiva localizare. Ambele nume reprezink de fapt abre-
vier’ fn conformitate cu standardele ISO. Codutileasociate limbilorreprezint&
out litere mici ale alfabetului ca de exemplu "en" pentru englezi, in timp ce
codurile asociate prior eprezinti dous ltere majuseule, ca de exemplu "US"
entra Statele Unite
acl doris vedet lista competi a acestorabrevier,vizitaji urmitoarele
sitesi
© nttp://www. ics.uci-edu/pub/ietf/nttp/related/
180639. txt, pentru codurile asociate limbilor;
© http://www. chemie. fu-berlin.de/diverse/doc/
150_3166.. html, pentru codurile asociate firilor.
Existd ins anumite valori predefinite pentru unele fri (Canada, Franja, Germa-
nia, alia, Statele Unite ete.) sau pentru unele limb (engleza, franceza, italian’
etc.) identficabile in cadrul clasei Locale prin intermediul atributelor statice
ale clasei (CANADA, FRANCE pentru firi sau, respectiv, ENGLISH, FRENCH,
pentru limbi)
337J, TIMPUL, NUMERELE DATELE CALENDARISTICE
In general opera iterafionalizarea (formatarea une date
calendarstice, de exempl),folosesc ca argument instanjaa clasei Locale.
Dac acest lueru nu este specifica, atunc se foloseste localizarea implicit
Exemplat 1
iM foloseste localizarea implicita in
i/operatil de internationalizare
SLocale loc = Locale. getDetault (Qs
1 Wafiseaza limba arociata localizarti curente
{System -out. printin (loc. getDisplayLanguage ())
tHofiseara tara asociata localizaril curente
+ System. out. printla (loc. getDisplayCountry ()):
Daci, de exemplu, localizarea implicit este reprezentati de
‘i Statele Unite, atunci seeventa de cod anterioari afigeaz
ba englezi
English
United states
Exemplul 2:
Mereaza 0 tocalizare pentru Romania si limba romana
“primal parametra este codul ISO pentru limba romana
“al doilea porametra este codal 30 pentra namsle tacit
Locate al = new Lacale ("ro Dy
© localizare poate fi facut implicité pentru o instanjai a JVM-ului prin
metoda set Default (), ca in exemplul urmitor, fn caren este variabila
din exemplul precedent)
(localizarea romana este setata ca flind Implicita
Locale. setDefault(al):
Mtocatizarea germana este setata ca fiind implicita
Locale. setDerault (Locale GERMAN):
Daci o localizare nu este ficut impliciti prin apelul metodei setDefault,
tunel localizarea impliciti este reprezentati de limba in cate a fost instalatd
disteibuyia J2SDK.
‘Timpul poate fi formatat utilizand clasa DateFormat. De asemenea, cu
ajutonul acestei clase se pot formata si datele calendatistice sau se pot cons-
‘ui impul si datele calendaistice intro forma independenti de limb. Clasa
‘fer numeroase metode statice pentru objinerea timpului/datelor calendaris-
tice, pe baza localizariiimplicite sau a uneia specificate explicit, $i pe baza unui
338il TIMPUL, NUMERELE §!DATELE CALENDARISTICE
rnumarde sir de formatare. Acestea incu opfunile FULL, LONG, MEDTUM,
ssioRr. fn general,
«© optiunea SHORT reprezinté datatimpul in forma: 10.12.02 sau 3:30 PM;
© opfiunea MEDTUM formateaz’i data/timpul astfel: Dee 12, 2002;
* opfiunea LONG formateaza datatimpul astfel: December 12, 2002 sau
3:30:55 PM;
«© opfiunea FULL formateazi data/timpul astfel: Thursday, December 12,
2002 AD sau 3:30:55 PM PST.
Pentru a putea formata timpul in localizarea curent’, este necesari objinerea
tunel instanje, folosind metoda get TimeInstance () aclasei DateFormat.
Formatarea propriu-zist se realizeaz’ cu metoda format (), ca in exemplul;
\Hafisarea timputui forma scurta in locatizarea implicita
:DateFormat tf = DateFormat. getTimetnstance( DateFormat SHORT);
System out. printia (tf. format (new Date())):
2 //afisarea timpului Jorma scurta in localizare italiana
str = DateFormat . getTimelustance (DateFormat -SHORT,
F Locale ITALY):
System. out. printla( tf. format (new Date())):
Rezultatul executiei acestei seevenfe de cod arata astfel:
11:39 AM
11.39
Prima valoare afigati reprezinttimpul pentru localizarea implicit (engleza
‘azul nostru, iar cea de a doua reprezintd timpul in localizare italiani. Dife-
renga de formatare dintre cele dour valori este cit se poate de cla.
Pentru a formata data calendaristicd in localizarea curenti, se folosese me-
todele getDaternstance() (pentru objinerea unei instange a clasei care
permite administrarea datelor calendaristice) si format () (pentru formatarea
propriu-zist), ale clasei DateFormat:
\Hafisarea datel forma seurta in locatizarea implicita
DateFormat tf = DateFormat. getDatelnstance (DateFormat SHORT);
» System out. printin (tf, format (new Date ()));
SWafisarea datei forma seurta in localizere italiana
(tr = DateFormat . getDatelnstance (DateFormat -SHORT.
7 Locale ITALY):
System. out. printa (ef, format (new Date ())):
339,J. TIMPUL, NUMERELE DATELE CALENDARISTICE
8 //ofisarea datei forma scurta in localizare_germana
(15 DateFormat. getDatelnstance DateFormat -SHORT,
E Locale GERMANY):
‘System out. printia (tf format new Date()))
Secvenfa afiseazi urmatoarele valori pentru 19 ianuarie 2002, corespunci-
toare localizariiimplicite (englezA, in cazul nostru), localizariiitaliene (a doua
variant) si localizarit germane (a treia varianta)
1/19/02
19/01/02
19.01.02
Analog poate fi folositi metoda parse () , care, spre deosebire de metoda
format (), care transforma o dati calendaristicd intr-un string, realizeaz.t o-
perajia inversi, de creare a unei date calendaristice dintr-un string,
‘Numerele, procentele si sumele de bani se formateaza utiizand clasa Num
berFormat, intrun mod asemanator cu cele prezentate anterior,
‘Agadar, pentru a formata un numar int-o localizare Ia alegere se utilizeazi
metodele get Instance () si format ()
\/afisarea numerelor in localizarea implicita
NumberFormat nf = NumberFormat. getInstance ():
) System out, printla (at, format (12500.5)):
S/afisarea numerelor in localizare germane
‘nf = NumberFormat getInstance (Locale GERMANY)
» System out. printla (af. format(12500.5)):
Rezultatul este:
12,500.5
12.500,5
Prima valoare afigatd este pentru localizarea implicita (engleza in cazul nos-
‘ra, in timp ce cea de a doua este pentru localizarea german’.
Formatarea procentelor se realizeaza prin metodele get Percent Instan-
ce() si format ()
‘/afisarea procentelor in localizarea britaniea
NumberFormat nf = NumberFormat. getPercentInstance Locale UK);
System. out, printin (al. format (0.3));
Rezultatul afisat in urma executiei acestei seevente este
308
340D2. COLECTILE DE RESURSE ININTERNATIONALIZAREA APLICATILOR
Formatarea monetari se realizeaz& prin getCurrencyInstance() si
format ():
\Wafizarea unei same de bani in localizarea implicita
NumberFormat nf = NumberFormat getCurreneylnstance ()
2 System out. printla (af. format (8399.99):
S/fafisarea unei sume de bani in localizare italiana
tn = NumberFormat. getCurrencylnstance (Locale ITALY);
1 System out. printla (tf. format (8599.99).
Rezultatul poate considerat un pie surprinzator:
$8,599.99
L, 8.600
‘Surpriza o constituie faptul e& pentru lira italian’ nu se consider’ subdivi
ziuni, sumele find rotunjite pentni a se objine valori intregi, acest lueru da-
in comparatie cu celelalte
‘monede. Ca gin cazul datelorcalendaristice, se poate utiliza metoda parse ()
pentru a realiza operatiile inverse, de transformare a stringurilor in numere,
robabil ei sunt programatori care considers
timpului, a datelor calendaristice si a numerelor sunt doar detalii de afigare a
rezultatelor si nu au implicaii foarte mari, Utilizator aplicapilor s-ar putea
si nu fie de acord cu aceasti pozitie, in special din cauza faptului c& afigarea
rezultatelor nu se face in conformitate eu asteptirile lor. De aceea, programa
‘ori trebuie si fie foarte atengi la acest dealiu pe care, poate, pani acum nu I-au
tratat cu indeajuns de multa seriozitate, pentru a realiza.o afigare a datelor int-o
form’ cat mai "prietenoast"
torindu-se faptului ci moneda italiana este "slabi
D.2_ Colectiile de resurse in internationalizarea apli-
catiilor
‘Cand programatorii de la Sun au seris codul pentru cele dous clase, Date~
Format si NumberFormat, ei au fost cei care au decis ce localiza si suporte
(englezi, francez’, german’ etc.) si au oferit astfel modalitatea de a realiza con-
versiile de date pentru respectivele localizati. Deoarece vatiatile datelor calen-
daristice gi ale numerelor nu sunt foarte mari ei au putut implementa clasele
DateFormat si NumberFormat, in conformitate cu respectivele localizari,
ditect in biblioteca de clase (API) pe care Java o ofr
Din pacate, lucrurile nu au mai fost la fel de simple in cazul mesajelor de
tip text. Ar fi fost imposibil pentru programatori de la Sun si anticipeze toate
34D2. COLECTILE DE RESURSE IN INTERNATIONALIZAREA APLICATILOR
imesajele de tip text folosite in aplicagi (existente sau viitoare) gi si ofere tradu-
cerile necesare. Din acest motiv, au Hisat aceasta sarcind programatorilor Java
‘care realizeaza aplicajiiinternasionalizate. Aceasta inseamna ci programatorul
Java este cel care decide ce localizari suport aplicatia, urmand ca to el si ofere
traducerile mesajelor text pentru fiecare localizare suportata de aplicaja sa, Cu
alte cuvinte, programatorul va crea 0 colectie de stringuri pentru © anumiti
localizare si le va utiliza in diverse locuri pe parcursul aplicafici
Pentru a realiza acest demers, implementatori limbajului Java au pus la dis-
poziia programatorilorcolecile de resurse (engl. resource bundles), cunoscute
altfel si sub numele de pachete de resurse.
D.2.1 Un exemplu concret
Colegfile de resurse inglobeazi toate informagile specifice unei anumite
localiziti. Dupi cum am vizut in parageaful 7.5 (pagina 212), flecare resursi
‘este asociata cu o cheie, care riméne neschimbati pentru toate localizatile. Va-
Toarea asociati acestei chei se schimbi insti pentru fiecare localizare tn parte,
reprezentind de fapt traducerea in respectiva limb a informayiet deyinute de
resursi
‘Si considerim urmatorul exemplu: dorim si realizim o aplicaje care afi-
seaza in diverse limbi, nojiunile de calculator, hard-disk, monitor gi tastaturs.
Deoarece aceste denumiri se vor schimba in cadrul colectiilor de resurse, fiind
{nlocuite cu traducerile lo, trebuie sa le asociem cu niste chei care vor rimane
neschimbate, Presupunem c& avem urmatoarele asocier
cheie | valoare
cale | calculator
hdd | hard-disk
mon | monitor
tast | tastatura
Asocierile de mai sus formeaza o colectie de resurse, cu patru perechi de
tipul cheie-valoare. Pentru fiecare limba in care dorim si traducem aceste noji-
uni, vom avea cate o colecjie de resurse in care cheile vor fi aceleasi cu cele an-
terioare, iar valorile vor reprezenta traducerile potrivite pentru fiecare nofiune.
‘Vom considera c& avem traducerile nojiunilor anterioare in treilimbi: englez’,
germani si francezi, Prin urmare, vom avea alte trei coleefii de resurse, cate
luna pentra fiecare limba in eare facem traducerea:
« pentru limba engleza
342D2. COLECTILE DE RESURSE ININTERNATIONALIZAREA APLICATILOR
cheie | Valoare
cale | computer
nda | hard disk
mon | monitor
tast | _—_‘keyboard
© pentru limba german
cheie | Valoare
calc | Computer
hde | Platte
mon | Monitor
tast | ‘Tastatur
«© pentru limba francez
cheie | Valoare
calc | ordinateur
nde | disque dur
mon | moniteur
tast | clavier
Dupi cum se observ, faptul acese chei rimén neschimbate ne aj si aso-
ciem corect fiecare nojine eu traducerea ei. Astfel, nofiunea calculator
are in primol tabelasociatécheia ca ic, eae corespunde in urmatoarele tet
tabele cuvintelor conputer, Computer, ordinates, cu alte cavinte am
‘objinut raduceren noiunil in care inte ele te imbi
‘Un set de colectt de resurse formeazi un grup. Grupul are un nume, ales
sugestiv de programator. Anslog, fecae colecje de resurse din cade grup
tre un nme, construit in mod unie: numielegrapului, urmat de numel timbi
fn are sunt taduse resusele, de numele fi i de variant (variant reprezin-
to subregiune aunt fir). Ukimele dout adiugari de nume sunt opfionale
Numele limb gi celal pri sunt reprezentae prin abrevier de dou liter, in
conformitae cu standardele 150. De exemplu, abrevierea penta Canada este
CA", iar pent limba francezi este “fr. in majortatea cazuriloraceste nume
sunt evidente
Una aspect important legat de modu de construire a numelui une colestit
de resurse este e8 fecare nume este separat de urmtorl prin simbolul "_D2. COLECTILE DE RESURSE IN INTERNATIONALIZAREA APLICATILOR
Important de rein estes faptul cd exist o colecie care are acelagi ume cu
mvp din care face parte. Aceasta este denumitacolecia implicit
‘Desi modalitatea de denumite a coleilr din cadnl unui grup poate prea
dificil a este de faptdestl de simp, Petra averifica aceasta firma, até
‘cum arataaceste denumir in exemplal nosru: am denumit grupul de coect
Componente, ceca ce inscamna ci ntmele colectiet implicit este tot Com
ponente. Considerim prima coletie prezentatt (cca in limba romana) ca
ind implicit. Cea de a doua coletc, cea cu tradvceile in limba engleza se
rnumeste, conform regli de demumire prezenaté anterior, Componente_en,
Analog, cclelalte dou colecii se numese Componente_de si Componen-
te_fr
Tn continuare vom vedea cum implementewzi Java colecfile de resurse sub
forma unorsubelase ale elaseiabstracte Resour ceBund!e:
* ListResourceBundle
* PropertyResourceBundle
‘Vom analiza fiecare dintre cele dou modalitiji mai detaliat in cele ce urmeazi.
D.2.2 Implementarea colectiilor prin List ResourceBundle
ListResourceBunde confine resursele in cadrul unor clase Java stan-
dard, a ciror denumire este dati de numele fiecirei colecfii de resurse, aga cum
‘fost el stablit prin aplicarea regulii de denumire, Aceste clase trebuie si
suprascrie metoda getContents () gi si ofere un sir care confine perechile
de resurse (chee, valoare) de tipul Str ing. Pentru exemplul nostr, lucrurile
stau astfel:
primul rind avem colectia implicit, implementata in modul urmator
figieral Componente. java)
vip
jae
Componente extends ListResourceBundle
5) state Anal Object {}{] contents = |
‘ [eomp". “calculator” },
: harddisk" }
: monitor” |,
5 fastaturs)
1D2. COLECTILE DE RESURSE IN INTERNATIONALIZAREA APLICATILOR
“]
apoi, avem implementarea cole
fisierul Componente_en. java):
de resurse pentru limba engleza (in
simport java util -w
Spublic class Componente_en extends ListResourceBundle
a
f) atatie final Object [JI] contents
5 (eomp". "computer" }
FI [ohdd® "hard disk" |
‘ moo" | "monitor",
[tase "keyboard
5 1
5 publie Object J{] getContents ()
of
implementarea colecti
figierul Componente_de. java):
je resurse pentru limba germana (in
sTmport java util -w
public class Componente_de extends ListResourceBundle
a
f) statie final Object [11] contents
a (eomp". "Computer" }
: [ohdd* ,"*Piatte® |
5 [mon | "Monitor",
D (tase, "Tastatury
5 1
public Object (}{] getContents ()
» 4
{in final, implementarea colectiei de resurse pentru limba francez’ (in
fisierul Componente_fr. java):
345D2. COLECTILE DE RESURSE IN INTERNATIONALIZAREA APLICATILOR
sTmport java wail
public class Componente_fr extends ListResourceBundle
a
5) static final Object 11) contents = |
ji (eomp". “ordinateur” },
5 [ohdd","*disque due”),
: [mon *moniteur™},
: [tase “elavier")
* K
»
By .
"
bie Object [IL] getContents C)
(data clasleimplementat, ele pot futlzate cu succes, conform exemplult
din paragrafulD.2.4.
Pina atunc, iat céteva detali importante legate de implementarea colecj-
itor de resurse prin aceasta metoda. In primul rind, clasele au exact acelagi
‘numecucel stabil Ia definireacolefilor: Componente, Conponente_en,
Conponente_de, Componente_tr. In al doiea rind, informata de aso-
ciere cheilor eu valrile corespuncatoare est cor
Fiecare pereche cheie/valoare reprezinta un element al sirului contents. Din
‘cauza faptului eX datele sunt stocate in interiorul unor clase, apare un dezavan-
‘aj destul de important: clasele trebuie recompilate pentru orice modificare
valorilor. Este motivul pentru care aceasté variant este mai pujin uilizati de
programatori
alternativi a acestei clase este clasa PropertyResourceBundle,
‘care refine resursele in figiere de proprietii
D.2.3 Implementarea colectiilor prin PropertyResourceBundle
Clasa PropertyResourceBundle foloseste un tip special de fisiere
pentru a stoca informatile de mapare acheilor si a valorior. Aceste fisiere sunt
‘de fapt simple fsiere text, cu extensia .propert ies. Numele fiecdrui fisier
de acest tip este dat tot de regula de denumire a colecfilor de resurse. Asadar,
‘n exemplul nostru sunt patra fisere de proprietigi cu urmatoarele denumi
© Componente.properties
© Componente_en.properties
346D2. COLECTILE DE RESURSE IN INTERNATIONALIZAREA APLICATILOR
© Componente_de.properties
© Componente_fr.properties
Formatul special al figierelor de proprietifi apare datorti faptului ci perechile
‘cheie/valoare sunt stocate pe cate o line separatd. Fiecare lini este formata din
ccheie, urmati de semnul "=", iar final este adiugati valoarea asociati cheii
Pentru exemplul nostru, cele patru fisiere .properties au urmatorul
cconyinut:
* fisierul Componente. properties:
comp=calculator
hd I-disk
mon=monitor
tast=tastatura
« figierul Componente_en.properties:
comp=computer
hddehard disk
monsmonitor
tastekeyboard
figierul Componente_de.properties:
comp=Computer
hdd=Platte
tast=Tastatur
« figierul Componente_fr .properties:
comp-ordinateur
hdd=disque dur
mon=noniteur
tasteclavier
In acest momen, fiierele de proprietj sunt gata pens fu
a7D2. COLECTILE DE RESURSE IN INTERNATIONALIZAREA APLICATILOR
D.2.4 Utilizarea colectiilor de resurse
Indiferent c& agi optat pentru prima metoda de implementare a colectiilor de
resurse (utilizénd clasa List ResourceBundle), sau pentru cea de a doua
(prin intermediul clasei Proper tyResourceBund.e),utilizarea colectilor
de resurse se realizeazi in acelasi mod. Agadar, dact doriji si treceti de la
(© metoda la cealalta, nu trebuie s modificaji nimic in modul de utilizare a
colectilor de resurse,
Aceasta secjiune va arita cit de elegant se face traducerea nofiunilor alese
i
s System. out. printla ("EXCEPTION: * +
: e.getMersage ())3
a
Prezentat pe scurt, programul anterior seteaziilocalizarea implicit ca f-
ind cea romani, iar apoi utilizeazi colectia de resurse atagati localizirit im-
plicite (cu alte cuvinte, colectia de resurse impliciti, Componente), pentru a
descoperi valorile atasate celor douiichei "comp" si "tast™, valori pe care
le afigeazi, Rezultatul execufiei acestui program este
calculator
tastatura
Analog se pot afisa valorile celorlalte chei
348.D2. COLECTILE DE RESURSE IN INTERNATIONALIZAREA APLICATILOR
Pentru a vedea adaptabilitatea foarte bund a colecilor de resurse la modifi-
carea limbilor folosite, realizayi in programul sursi anterior modificdrile nece-
sare pentru ca programul si arate astfel:
import java utiles
dpublic elas ULIRB
at
public statle yold main(String) args)
oo
F try
D t
D Locale. setDefault(new Loeale("r0", “RO))
fA RerourceBundle rb = ResourceBundle . getBundle(
FE “Componente”, Locale . ENGLISH);
5 String 5 = rh. getString ("comp"):
eB System out. printin(s):
5 5 = 1b. gerString ("tase"):
™ System out. println(s):
* }
5 eateh (Exception &)
5 t
e System out. printin ("EXCEPTION: * +
e fe. getMessage ()):
» 1
sy
“)
‘Modificarea consti in faptul cd sa schimbat localizarea, adicd limba curenta
in care se fac afigirile de date este cea englez3. Dat fiind faptul c& localizarea
‘curenti este cea engleza, la rularea programului, Java va prelua valorile cheilor
"comp" si "tast™ din colectia de resurse asociati limbii engleze, adic’ din
colectia Componente_en. in urmacxecutici, vor fi afigate rezultatele:
computer
keyboard
Analog se poate objine traducerea nofiunilor in celelalte dous limb pe care
Je-am ales: germana si franceza. Pentru a realiza acest demers, rebuie doar si
inlocuiji Locale .ENGLISH in programul anterior cu Locale. GERMAN $i
‘mai apoi cu Locale. FRENCH,
‘Un lucru important care trebuie amintt este legat de modul in care Java
identifick pachetul de resurse pentru o anumiti localizare. Colectia este cata
{in cadrul grupului din care face parte, conform pagilor algoritmului urmator,
349,D2. COLECTILE DE RESURSE IN INTERNATIONALIZAREA APLICATILOR
clutarea incheindu-se in momentul in care este gisita colectia ciutata sau s-a
ajuns la colectia implicit’,
1. bundleName_localeLanguage_localeCountry_localeVariant
2, bundleName_localeLanguage_localeCountry
3, bundleName_localeLanguage
4, bundleName_defaultLanguage_defaultCountry_defaultVariant
5, bundleName_defaultLanguage_defaulCountry
6, bundleName_defaultLanguage
7, bundleName
bundletene reprezinti numele grupuli, iar LocaleLanguage, 1locale-
Countzy si locallevariant se referi la limba, jaa si epiunea localizes
specifcae,intimp ce default Language, defauleCountry sidefault-
Variant se refer la localizarea implicit
entra a injelege mai bine acest algortm de chutare a colectilor de resuse,
vom arita cum se realizeazk clutarea in exemplul nos. Mai inti sh iden
tiflcim numele din algoritm: bundLewame este in exemplal nostru Compo-
nente, localebanguage este fe en (engleza), fie de (germans), fie £r
(francera),in timp ee localeCountry si localeVari ant lipsese. Pe de
altiparte, defau1tLanguage este ro (romina),in imp ce defaultCoun-
try si defaultvariant lipsese de asemenea,
ack, de exemplu, dorim si clutim colectia de resurse penta limba ger
rani, trebuie si ciutim colefia cu numele Componente_de, eu alte euvinte
bundiewane ia valoarea Componente, ir Loca leLanguage ia valoarea
de. Pentra ci nu avem in acess situafie LocaleCountry sau Localeva
rFiant, algoritmol va fi executat pin la pasul 3, cind se opreste pentm ci a
sit colecia cu numele Conponente_de
fnt-un mod aseminitor, dact dorim si ciutim colectia de resurse pen-
tru limba franceza vorbti in Canada (new Locale ("é", "CA*)), fava
va ciutacoletia cu numele Componente_f1_CA. Executind pasi algort-
mului anterior, ne vom opri la pasa 3, penta ch nu exstéo colecie mumiti
Componente_fx_Ca (si din acest motiv nu ne putem opr la pasul 2), dar
existhuna numiti Componente_£, Agadar,in aceast sitajie vom aveatra-
ducerte din limba francez’ standard, nu traducerile pent dalectl de iba
francezi vorbitin Canada,
350D3, INTERNATIONALIZAREA MESAJELOR DINAMICE
Foryand un pic nota, dack dorim si ciutaim colectia de resurse pentru limba
ind (Locale . ITALIAN), Java cauti colecjia de resurse cu numele Com-
ponente_it, dar cum nu avem nici o component cu nume aseminator,
‘cAutarea se va incheia la pasul 7, la colectia implicit Componente, tradu-
cerile fiind preluate din aceasta colecfi, Prin urmare, daci nu avem o colectie
asociatd unei localizati specificate, traducerile vor fi oferte din colectia impli-
cit
Folosind tehnicile prezentate in primele dou’ sectiuni ale acestei anexe, se
pot construi aplicai simple care afiseaza utilizatorului date in orice localizare.
Datele pot fi valori ale timpului, date calendaristice, numere sau simple mesaje
statice, cum ar fi cele prezentate anterior, Dacii dorim si folosim mesaje di
namice (de genul: "x figiere au fost sterse"),lucrurile se modific’
destul de mult, Sectiunea urmétoare arati cum trebuie tratate mesajele de acest
tip.
D.3__ Internafionalizarea mesajelor dinamice
Din perspectiva progeamatorului care rescrie aplicaiiints-o alt limba, cu-
vintele sunt cea mai simpli parte ce trebuie implementata, De exemplu, cind
se traduc cuvintele din englezi in german’, "Yes" devine "a", "No" devine
"Nein" si asa mai departe. Chiar si frazele simple, de tipul "Do you want
to save the modifications?", pot fi inlocuite in intregime cu tradu-
cerile potrivite. Dacit traducerile s-ar rezuma doar la exemple simple, de tipul
ccelor mentionate anterior, atunci nu ar fi probleme, Dar ce facem daca suntem
nevoiti si traducem un mesaj de tipul: "You copied 2 files"? Spre de-
cosebire de mesajele anterioare, acesta este un mesaj dinamic, confine informa
‘care se modificd in funcjie de alte opera.
(© metoda de rezolvare ar putea fi impairea mesajului in mai multe parti, in
aga fel incat partea dinamica a mesajului si fie desparité de cea staticd. Cu alte
a trei pai: "You copied", "2" si "files".
fn acest fel, partea dinamicd a mesajului ("2") este separata de cea static’.
Apoi, ar urma ca cele dows parti static si fie preluate din colecfi de resurse,
unde arf traduse separat, Practic, codul ar fi asemiinator cu:
ResourceBundle rb = ResourceBundle. getBundle(* Strings")
:String str = rb. getString("first") + aFiles +
: th, getString ("second"):
unde "first" si "second” ar fi cele cheile asociate celor dows pati
statice ale mesajului, iar nFiles ar fi numarul de fisiere ce va fi copia,
351D3, INTERNATIONALIZAREA MESA/ELOR DINAMICE
Din picate, abordarea precedenti nu este universal valabili, deoarece este
posibil ca in alte limbi ordinea cuvintelor si nu mai fie aceeasi, Desi noi am
‘considerat c& elementele care compun textul au o anumiti ordine, exist limbi
{in care aceasta ordine nu poate fi respectati. De exemplu, in limba german’
verbele se pun la finalul propozitci.
Din fericire, exista o solutie pentru aceasta problemé. Trebuie si credim un
sablon corect din punct de vedere sintactic pentru fiecare localizare, iar apoi
Ja executarea aplicajei sablonul este combinat cu partea dinamic& a mesajului
(altfel spus, cu parametri), Abilitatea de a combina sablonul cu parametii este
oferit in Java prin intermediul clasei NessageFormat.
Primul pas care tebuie realizat este crearea cate unui sablon pentru fiecare
localizare suportaté de aplicajie. Sablonul presupune inlocuirea pirtilor dina-
mice ale mesajului, cu parametri, ca in exemplut:
"you copied 2 files" --> "you copied (0) files"
fn cazul most, singura pare dinamich a messjului este "2* gia fos in-
Jocuité eu parametral "(0)". Dac ar fi existat mai multe pig dinamice in
‘adral mesajulu, parame ar fost (2), (2) ee
CConsiderim gablonul anterior ca find asocitIoealiziitimplicie i cazal
rosin, localizarea engleza). De asemenea, considerim si sablonul pent lo-
calizarea romani:
"Ati copiat (0} fisiere™
La executarea aplicafei, parametrul (0 } este inlocuit in cadrul sablonului,
‘cu numarul de figiere copiate, asa cum a fost el calculat in cadrul aplicatci
Cele dou sabloane, cite unul pentru fiecare dintre cele dou localizasi, vor
fi preluate din coleciii de resurse si folosite pentru a crea mesajele dinamice.
Considerim ci numele grupului de coleetii este "Messages", iar cheia aso-
ciata sablonului este "ms"
Colecjia de resurse implicita este urmitoarea (Messages .propert ies):
mag=You copied (0) files
Pe de alti parte, colecjia de resurse pentna limba romani arati astfel(figieral
Messages_ro.properties)
msg=Ati copiat (0) fisiere
Pentru localizarea imp!
352
1, seoventa de cod arata astfel:D3, INTERNATIONALIZAREA MESAJELOR DINAMICE
1 Resourceltundic rh = ResourceBundle. getBundle ("Messages");
)MessageFormat mf = new MessagePormat( rb. getString "msg" )):
sObject{] args = (new Integer(2))
System out. pi
tla (mf, format (args):
La execuia codului va fi preluat din coletia implicit sablonul "You co-
pied {0} files™. Prin apelului metodei format (), sablomul este com-
binatcu vaorte flat in variabila args. Practc, prameti sablonulu sunt in-
locuijicuvalorile de pe pore corespunzitoare dn siral args. In azul nos-
tr, parameteu {0} esteinlocuiteu args {0} adicdcu elemental 2, obginindu~
se mesajulformatat "You copied 2 files".
Pentru obfinereataduceri acest mesa in limba romana, modifica prima
lini seovenei de cod anerioare, astfel inca s fede form
ResourceBundie th = ResourceBundle getBundle( “Messages
few Lovale ("ros RO!)
Analog celorprezentate anterior, se va objine un messj deforma "Xt con
plat 2 fisieret
[Exempleleanterioare folosese cele mai simple forme de parametr in cadrul
unui sablon, Java oferdposibiltatea de a realiza formatiri mult mai complexe.
Un parametru este format de fapt din trei cdmpuri separate prin simbolul
‘© Primul cmp reprezinti un numir, care indic& pozitia din cadrul sirulut
de obiecte, a obiectului cu care va fi fnlocuit parametrul la formatare. De
‘exemplu, parameteul 0 indict faptul e& va fi inlocuit eu elemental de pe
Pozitia 0 din si, parametrul I cu elemental de pe poviia I ete.
© Al doilea camp este optional gi se refer la tipul obiectelor formatate.
Poate avea una din urmitoarele valori: time, date, number, choice:
Al trilea cmp este de asemenea opjional si se refera la stilul de for-
‘matare a obiectelor. Daci formatul stabilit la punctul anterior este time
sau date, atunci stilul poate avea valorile: short, medium, long,
£u11 sau un stl de dati definit de utilizator. Daca formatuleste number,
atunci stlul poate avea valorile: currency, percentage, integer,
sau un stil de numar definit de u
Tata citeva exemple de parametti
{0} ~ formateaza elementul de pe pozitia
353D3, INTERNATIONALIZAREA MESA/ELOR DINAMICE
0 din sir
(0, time} - formateaza elementul de pe pozitia
0 din sir ca reprezentand timpul
(0,date, short} - formateaza elementul de pe pozitia
0 din sir ca fiind o data
calendaristica in format scurt
(0, number, percent) - formateaza elementul de pe poz.
0 din sir ca fiind un procent
Formatul choice este mai special sil vom descric in continuare, Opyiunea
‘choice (din lista de opiuni pentru edmpul al doilea al unui parametra) permite
atagarea de mesaje unui anumit domeni de valori. Opjiunea este util pent
‘ci poate modifica mesajele in functie de anumite valori ale parametrilor. Dacis
in exemplul nostru, valoarea parametrului ar fi fost I sau 0, mesajul ar fl aritat
astfel:
"You copied 1 files"
"you copied 0 files"
Prima propozitie nu este coreeti din punct de vedere gramatical (£iles
‘este la plural) si Java ne ajuti si evitdm o astfel de situate, prin folosirea opfi-
unit choice. Opfiunea ne ofera posiblitatea de a modifica mesajul in functie
de valoarea parametrului, astfelinc&t si avem urmatoarele mesaje:
‘© daci parametrul are valoarea 0, atunci mesajul este "You copied no
files."
daca parametral are valoarea 1, atunci mesajul este
"You copied 1 file.";
‘© daci parametrul are valoarea > 1, atunci mesajul este "You copied N
files. ",unde N este un numa
‘Sintaxa opfiunii choice este descrisi in continuare, Opjiunea este specificatd
‘aun set de alternative, separate prin simbolul "|". O alternativa consti dintr-o
limitare numericd gi un mesaj. Alternativele sunt ordonate dupa limitarea nu-
mericd. Limitarea reprezinta un numir double, care poate fi specificat in doua
moduri:
354D3, INTERNATIONALIZAREA MESAJELOR DINAMICE
© N#,ce inseamna cX pentru toate valorile mai mari decatN, inclusiv, mesajul
este valabil;
© Nc, ce inseamni c& pentru toate valorile mai mari decit N, exclusiv,
‘mesajul este valabil
Folosind opfiunea choice, gablonul mesajului nostru aratl astfel:
"You copied (0, choice, 0#no files|1#1 file|
1<{0} files)"
Desi pare destul de complicatd, la o privire mai atent’ se poate obseva ci
utilizarea choice nu este chiar atit de dificil. $ablonul ne devalue cA for-
‘matarea se aplici parametrului 0, adica elementului de pe pozitia 0 din sirul
de elemente, ca este o formatare de tipul alegere (engl. choice) cu treialter-
native, separate prin doua simboluri "|". Prima alternativa indica faptul c
mesajul "no files" va fi afigat pentru valori ale parametnului > 0 si < 1
(conform limitirii numerice a celei de a doua alternative), adic& pentru valoa-
rea 0, Aseménator, alternativa a doua indica faptul ci mesajul "1 fie" este
afigat pentru o valoare a parametruluiintre > 1 (limitarea numericda alternative!
adoua) si < 1 (limitarea numericd a alterativei a treia), adic’ pentru valoarea
parametrului. Alternativa a treia indici faptul pentru valori ale parametrului
> 1, se afigeazii mesajul "NY £3 les", unde N este valoarea parametruli
‘Dupi cum se poate observa, limitirile numerice ale alternativelor sunt or-
donate erescator (0,1, 1).
Cu prezentarea formatiri mesajelor dinamice se incheie si ultima etapi care
trebuie parcursii pentru a putea crea aplicafiiinternajionalizate la standarde pro-
fesionale. Ajuns la acest nivel, programatorul Java trebuie si constientizeze
faptul e¥ intemafionalizarea aplicajiilor nu mai reprezint& o irosire a timpului,
You might also like
- Her Body and Other Parties: Stories From EverandHer Body and Other Parties: StoriesRating: 4 out of 5 stars4/5 (821)
- A Heartbreaking Work Of Staggering Genius: A Memoir Based on a True Story From EverandA Heartbreaking Work Of Staggering Genius: A Memoir Based on a True StoryRating: 3.5 out of 5 stars3.5/5 (231)
- Devil in the Grove: Thurgood Marshall, the Groveland Boys, and the Dawn of a New America From EverandDevil in the Grove: Thurgood Marshall, the Groveland Boys, and the Dawn of a New AmericaRating: 4.5 out of 5 stars4.5/5 (266)
- The Sympathizer: A Novel (Pulitzer Prize for Fiction) From EverandThe Sympathizer: A Novel (Pulitzer Prize for Fiction)Rating: 4.5 out of 5 stars4.5/5 (121)
- On Fire: The (Burning) Case for a Green New Deal From EverandOn Fire: The (Burning) Case for a Green New DealRating: 4 out of 5 stars4/5 (74)
- Team of Rivals: The Political Genius of Abraham Lincoln From EverandTeam of Rivals: The Political Genius of Abraham LincolnRating: 4.5 out of 5 stars4.5/5 (234)
- The Yellow House: A Memoir (2019 National Book Award Winner) From EverandThe Yellow House: A Memoir (2019 National Book Award Winner)Rating: 4 out of 5 stars4/5 (98)
- ArabicDocument142 pagesArabicSue Melehani100% (4)
- ArabicDocument142 pagesArabicSue Melehani100% (4)
- Sebook: The Essential Language Guide For Contemporary IraqDocument102 pagesSebook: The Essential Language Guide For Contemporary IraqCharlie Nicol0% (1)
- Sebook: The Essential Language Guide For Contemporary IraqDocument102 pagesSebook: The Essential Language Guide For Contemporary IraqCharlie Nicol0% (1)
- The World Is Flat 3.0: A Brief History of the Twenty-first Century From EverandThe World Is Flat 3.0: A Brief History of the Twenty-first CenturyRating: 3.5 out of 5 stars3.5/5 (2259)
- Hidden Figures: The American Dream and the Untold Story of the Black Women Mathematicians Who Helped Win the Space Race From EverandHidden Figures: The American Dream and the Untold Story of the Black Women Mathematicians Who Helped Win the Space RaceRating: 4 out of 5 stars4/5 (895)
- The Little Book of Hygge: Danish Secrets to Happy Living From EverandThe Little Book of Hygge: Danish Secrets to Happy LivingRating: 3.5 out of 5 stars3.5/5 (400)
- The Unwinding: An Inner History of the New America From EverandThe Unwinding: An Inner History of the New AmericaRating: 4 out of 5 stars4/5 (45)
- The Emperor of All Maladies: A Biography of Cancer From EverandThe Emperor of All Maladies: A Biography of CancerRating: 4.5 out of 5 stars4.5/5 (271)
- Elon Musk: Tesla, SpaceX, and the Quest for a Fantastic Future From EverandElon Musk: Tesla, SpaceX, and the Quest for a Fantastic FutureRating: 4.5 out of 5 stars4.5/5 (474)
- Probleme Clasa Ix C++ RezolvateDocument107 pagesProbleme Clasa Ix C++ Rezolvatenicior6775% (4)
- The Subtle Art of Not Giving a F*ck: A Counterintuitive Approach to Living a Good Life From EverandThe Subtle Art of Not Giving a F*ck: A Counterintuitive Approach to Living a Good LifeRating: 4 out of 5 stars4/5 (5794)
- The Hard Thing About Hard Things: Building a Business When There Are No Easy Answers From EverandThe Hard Thing About Hard Things: Building a Business When There Are No Easy AnswersRating: 4.5 out of 5 stars4.5/5 (345)
- Palestinian DialectDocument107 pagesPalestinian DialectHooda 100% (1)
- Grit: The Power of Passion and Perseverance From EverandGrit: The Power of Passion and PerseveranceRating: 4 out of 5 stars4/5 (588)
- Shoe Dog: A Memoir by the Creator of Nike From EverandShoe Dog: A Memoir by the Creator of NikeRating: 4.5 out of 5 stars4.5/5 (537)
- Never Split the Difference: Negotiating As If Your Life Depended On It From EverandNever Split the Difference: Negotiating As If Your Life Depended On ItRating: 4.5 out of 5 stars4.5/5 (838)
- The Gifts of Imperfection: Let Go of Who You Think You're Supposed to Be and Embrace Who You Are From EverandThe Gifts of Imperfection: Let Go of Who You Think You're Supposed to Be and Embrace Who You AreRating: 4 out of 5 stars4/5 (1090)
- All Quran Corpus PosDocument441 pagesAll Quran Corpus Posnicior670% (1)
- EA17Document5 pagesEA17nicior67No ratings yet
- Greeting & EtiquetteDocument1 pageGreeting & EtiquetteMourad Diouri No ratings yet
- Logica Computationala CursIIDocument67 pagesLogica Computationala CursIInicior67No ratings yet