ࡱ> RTQ7 D#bjbjUU &,7|7|Dlnnnn z********$<+ \-@+*+*~(@*~(~(~(!*~(*~(~(R))Q) u^n ())V*0*)- (^-)~(IMPLEMENTAREA BIBLIOTECILOR N JAVA Construirea de biblioteci abstracte (clase si pachete de clase) este o parte importanta in dezvoltarea aplicatiilor Java si nu numai. Voi incerca prin articolele acestei rubrici sa va trezesc curiozitatea privind modalitatile de abstractizarea a datelor si construirea de noi biblioteci de date abstracte. Toate aplicatiile existente in numerele anterioare ale revistei (nr. 1 - 21) folosesc caracteristici si clase existente in Java care sunt puse la dispozitie de bibliotecile standard (java.util, java.awt, etc.). Pentru inceput voi prezenta cateva lucruri de baza in realizarea unor biblioteci abstracte de date, urmand ca in articolole viitoare sa trecem la implementarea unei clase abstracte. Metode mostenite din Clasa Object Clasa Object declara un numar de metode care pot fi suprascrise de subclase ale ei (acesta inseamna ca in orice aplicatie putem suprascrie aceste metode). Cand implementam o clasa trebuie sa tinem cont de unele aspecte legate de obiectele instanta (cum trebuie copiate  \* MERGEFORMAT comparate, sterse, afisate sub forma unui String). Putem suprascrie aceste metode atunci cand comportamentul lor implicit nu satisface cerintele programului. Urmatoarele metode pot fi supraincarcate:  \* MERGEFORMAT public boolean equals(Object obj); public String toString(); public final native int hashCode(); protected native Object clone(); protected void finalize(); \* MERGEFORMAT  Obs: obiectele de tip array permit de asemenea suprascrierea acestor metode. Trei dintre aceste metode sunt publice si pot fi suprascrise de orice instante obiect, in timp ce doua metode sunt protejate si din acest motiv trebuie declarate publice in momentul in care sunt suprascrise. Vom analiza pe rand aceste metode: boolean equals(Object obj) Metoda folosita pentru a compara doua obiecte (obiectul pentru care se apeleaza metoda si obiectul transmis ca parametru). Metoda implicita oferita de clasa Object returneaza true daca cele doua obiecte reprezinta de fapt acelasi obiect, folosindu-se operatorul == . Ramane in sarcina programatorului sa decida cum se compara doua obiecte ale aceleeasi clase. Documentatia JDK defineste un set riguros de reguli ce trebuie avute in vedere atunci cand se doreste stabilirea egalitatii intre boua obiecte. Metoda equals implementeaza o relatie de echivalenta: Este reflexiva ; Este simetrica; Este tranzitiva; String toString() Metoda returneaza o reprezentare de tip String pentru obiectul care o apeleaza. Implicit returneaza un Sring sub forma: ClassName @ 1cc7a0, adica numele clasei urmat de caracterul @ si apoi o valoare in hexa a codului hash. Pentru a genera o reprezentare mult mai utila putem supraincarca acesta metoda si returna orice String care sa ne ofere informatii despre obiect. int hashCode() Un hash cod este o valoare intreaga ce reprezinta intreaga valoare a unui obiect. Codurile hash sunt folosite drept chei in tabelele de dispersie asa cum este implementata clasa HashTable din pachetul java.util. Versiunea implicita a metodei va incerca sa genereze un cod pentru fiecare obiect dar se poate ca la un moment dat sa genereze valori diferite pentru un acelasi obiect. Daca se intampla acest lucru atunci trebuie sa suprascriem metoda pentru a implementa o noua functie de dispersie (hash function) care va genera codurile hash corecte. De fiecare data cand este invocata metoda hashCode asupra aceluiasi obiect ea trebuie sa returneze in mod constant aceeasi valoare intreaga. Daca doua obiecte sunt egale conform metodei equals, atunci apeland metoda hashCode pentru fiecare din cele doua obiecte trebuie sa obtinem acceasi valoare intreaga. Programatorii se bazeaza de obicei pe implementarea implicita a metodei hashCode decat sa implementeze o noua versiune (ceea ce poate duce la o munca destul de dificila). object clone() Metoda va crea o copie a obiectului. Implicit doar obiectul curent este copiat si nu si celelalte obiecte spre care acesta poate avea referinte. Valorile primitive in Java sunt intotdeauna copiate. Metoda suprascrisa trebuie declarata public. Daca un obiect nu poate fi clonat va fi aruncata exceptia : CloneNotSupportedException. void finalize() Acesta metoda este apelata automat de colectorul de gunoaie (garbage collector) cand un obiect nu mai este referentiat si poate fi sters din memorie. Varianta implicita nu contine nici o instructiune in corpul metodei. Colectorul de gunoaie poate rula oricand, astfel incat nu se poate determina cu exactitate cand va fi apelata metoda finalize. Putem supraincarca acesta metoda in cazul in care de exemplu anumite date trebuie salvate intr-un fisier inainte de a fi pierdute sau o conexiune pe retea trebuie inchisa. Daca apare o eroare metoda poate folosi in declaratie si clauza throw, aruncand o exceptie de tipul Throwable. Daca acesta exceptie este aruncata atunci ea va fi prinsa de colectorul de gunoaie si ignorata, lasand programul sa-si desfasoare executia pana la final. Cam atat cu teoria !!! :-) Sa trecem la fapte, adica sa discutam pe exemple concrete: Presupun cunoscut modul cum se compileaza programele in Java si cum se ruleaza. Pentru incepatori recomand cartea Thinking in Java (Second Edition) de Bruce Eckel, care poate fi download-ata de pe site-ul autorului: www.bruceeckel.com). Incepem cu implementarea clasei ObjectMethods.java:  \* MERGEFORMAT import java.util.Date; class ObjectMethods //extinde implicit clasa Object { public ObjectMethods(int a, Date b, String[]c) //constructor cu parametri { i = a; d = b; s = c; } private ObjectMethods() //constructor fara parametri {} public boolean equals(Object obj) //mostenita din Object si suprascrisa { if (this == obj) return true; if ((obj == null) || !(obj instanceof ObjectMethods)) return false; ObjectMethods tmp = (ObjectMethods)obj; if (i != tmp.i) return false; if (!d.equals(tmp.d)) return false; if (s.length != tmp.s.length) return false; /* Un sir este un obiect. Apeland == sau equals se va verifica doar daca doua referinte indica acelasi obiect; de aceea un ciclu este necesar pentru a parcurge toate elementele vectorului si ale compara. */ for(int i = 0;i \* MERGEFORMAT <s.length i if s i equals tmp.s i return false return true/gereram aici o reprezentare o obiectului //sub forma de String public String toString() { StringBuffer sb = new StringBuffer(); sb.append("i= "+i+", "); sb.append("d= "+d+", "); sb.append("s= "); for(int i=0;i \* MERGEFORMAT <s.length i sb.append s i quot quot return sb.tostring public object clone/realizeaza o copie exacta o obiectului { ObjectMethods tmp = new ObjectMethods(); tmp.i = i; //nu putem clona un obiect de tip Date(), asa //ca vom crea un nou obiect initializat //cu valoarea lui d tmp.d = new Date(d.getTime()); tmp.s = new String[s.length]; for(int i = 0;i < s.length;i++) { tmp.s[i] = new String(s[i]); } return tmp; } public void finalize() { for(int i=0;i/true System.out.println(a.equals(b)); //false System.out.println(b.equals(a)); //false System.out.println(b.equals(b)); //true System.out.println(a); System.out.println(b); b = null; ObjectMethods c = (ObjectMethods)(a.clone()); System.out.println(a.equals(c));//true System.out.println(c.equals(a));//true System.out.println(a); System.out.println(c); //modific obiectul c (obiectul a //nu se modifica!!!!!)) c.modify(22); System.out.println("NEW c:"+c); System.out.println(" a:"+a); ObjectMethods m ;//= new ObjectMethods m = a; //m este referinta la a : daca //modific m se modifica si a !!!!!!! m.modify(99); System.out.println("m: "+m); System.out.println("a: "+a); System.out.println("NEW m:"+m); System.out.println("New a:"+a); } } \* MERGEFORMAT  $56GHPQ  0 1 6 7 H c 1A>?PQabst(#)#:#;#A#B#D# jU5>*CJ08$%&F G H d e y & F$a$D#01BC]tC#D#$a$ $. A!"#$% if@f Normal1$A56789;>*@B*CJH*OJQJTX_HmH sH tH >> Heading 1 <5CJ OJQJ@@ Heading 2 <56CJOJQJ>> Heading 3 <5CJOJQJ<A@< Default Paragraph Font,U@, Hyperlink >*phO Bulleted Listp & F >T^`  Numbered Listp & F >T^` D,$%&FGHde y 01BC]tCF000000000000000 0 0 0000000000000000000000D#D#D#5GP06>Pas(:AD#######&15?@IKPQSU\`egknsu #*+-.9=@AKT]`egrs|%'/9?@GHKMUV\]dhlpz|  %.5:?CISUVaemrtw} %,-45QZ]celw{  7?FUXiq%&34;=CLPQWY_`fgklstv{}~"%'./17=>DHO_bkqrz{ $()-.23:;EJNOVW]`imw}      " $ ) . 4 5 ; < @ D K L V W a b g i m n u w }      - 3 4 < D L Y c g l         , - 3 4 : < > ? F G L Z \ ] _ ` e f p q w x ~       # , - 0 5 9 : F G L N W ] e f o q z {        # ' / 0 5 6 ; < B C J L N O Z \ b c i l v y } ~  #*+-.7IPQXYadhimnuvz{ "'.289;<IJSV]^fhmnpr~ !"&'-.013467@AHIMTZ\abfgprz-IOPVX\]dpz !(+59@AFGKLSU[\abdhmox| %'(0148ABDEJKRSZdhinrxy  ")*,-57=?HJOPZ[cdh#*,24>@HIO{#19FIPZ_q~+.3<HJKVhk4<@Lfjouw~")2578>  (1AJWZ\]a!#$)*/39ILRUW[_bciju{69:;EWX`n !&89AM_`ht  %(5BO[_`iqux"(BCCF5Q7>a(CFusserDVD[D:\My Documents\NET\REFERATE\e-referate\informatica\Implementarea bibliotecilor in JAVA.docQ*d p  @OJQJo(phF@@CC8 -CC{D@@UnknownGz Times New Roman5Symbol3& z Arial"hr& 6 9!0@HServerusserOh+'04  4 @ L Xdlt|ssServererverv Normal.dotusser.d4seMicrosoft Word 9.0@@@dܶ@fuG2 Rs  1&WordMicrosoft Word  b"System &)Bw-@Times New RomanCwCw w0-@Times New RomanCwCw w0-- 42 `bIMPLEMENTAREA BIBLIOTECILOR    - !- 2 `b -2 PbN JAVAr  - !zP- 2 b @Times New RomanCwCw w0- 2 `b 0 2 `b 02 `]bConstruirea de biblioteci abstracte (clase si pachete de clase) este o parte importanta in  2 ``bdezvoltarea aplicatiilor Java si nu numai. Voi incerca prin articolele acestei rubrici sa va   72 `btrezesc curiozitatea privind m2 Abmodalitatile de abstractizarea a datelor si construirea de noi 2 `ebbiblioteci de date abstracte. Toate aplicatiile existente in numerele anterioare ale revistei (nr.   2 `b1  2 pb-02 vVb 21) folosesc caracteristici si clase existente in Java care sunt puse la dispozitie2 Sb de 2 )`cbbibliotecile standard (java.util, java.awt, etc.). Pentru inceput voi prezenta cateva lucruri de .  2 <`]bbaza in realizarea unor biblioteci abstracte de date, urmand ca in articolole viitoare sa  R2 N`/btrecem la implementarea unei clase abstracte.     2 Nwb 0 2 a`b 0@Times New RomanCwCw w0--2 s` bMetode mo /2 sbstenite din Clasa Object  - 2 sPb 0 2 `b 0 2 `b 0 2 db 0 2 hb 0 2 lb 0 2 pb 02 tWb Clasa Object declara un numar de metode care pot fi suprascrise de subclase ale ei     2 `\b(acesta inseamna ca in orice aplicatie putem suprascrie aceste metode). Cand implementam        P2 `.bo clasa trebuie sa tinem cont de unele aspecte O2 r-b legate de obiectele instanta (cum trebuie  2 `bcopiate 2 b  2 Nbcomparate, sterse, afisate sub forma unui String). Putem suprascrie aceste      2 `Ubmetode atunci cand comportamentul lor implicit nu satisface cerintele programului. n     2 ` bUrmatoarele  82 bmetode pot fi supraincarcate: 2 ab� �� �� �L���2 +������bpublic boolean equals(Object obj); public e����������������������� �����������������������������2 `�Y������bString toString(); public final native int hashCode(); protected native Object clone(); s ��������� ��������������������������������������� ������������������������� ����������������������4���2 `�������bprotected void finalize();d������������������������������2 �������b   2 &b 0 2 *b 0 2 .b 0 2 2b 0 2 6b 02 : b Obs: obiec  D2 &btele de tip array permit de asemenea   :2 +`bsuprascrierea acestor metode.   2 +b 0 2 =`b 0 2 =db 0 2 =hb 0 2 =lb 0 2 =pb 02 =t^b Trei dintre aceste metode sunt publice si pot fi suprascrise de orice instante obiect, in   2 P`Wbtimp ce doua metode sunt protejate si din acest motiv trebuie declarate publice in mo    2 Pdbmentul j2 b`?bin care sunt suprascrise. Vom analiza pe rand aceste metode:     2 bb 0 2 u`b 0-42 `bboolean equals(Object obj)d - 2 b 0 2 `b 0 2 `b 0 2 db 0 2 hb 0 2 lb 0 2 pb 02 tZb Metoda folosita pentru a compara doua obiecte (obiectul pentru care se apeleaza metoda   e2 `<bsi obiectul transmis ca parametru). Metoda implicita oferi   A2 $bta de clasa Object returneaza true  s2 `Ebdaca cele doua obiecte reprezinta de fapt acelasi obiect, folosindu 2 b-0(2 bse operatorul == .  2 `XbRamane in sarcina programatorului sa decida cum se compara doua obiecte ale aceleeasi     2 `bclase.  2 b 0 2 `b 02 db  2 lb  2 pb  2 tb 72 xb Documentatia JDK defineste u   e2 4<bn set riguros de reguli ce trebuie avute in vedere atunci 2 `Zbcand se doreste stabilirea egalitatii intre boua obiecte. Metoda equals implementeaza o   /2 -`brelatie de echivalenta:  2 -b @Symbolw@X CwCw w0-- 2 @`b  2 @gb -%2 @bEste reflexiva ;  2 @b - 2 S`b  2 Sgb -#2 SbEste simetrica;   2 Sb -- 2 g`b  2 ggb -%2 gbEste tranzitiva; - 2 gb -%2 z`bString toString()  - 2 zb  2 `b  2 db  2 hb  2 lb  2 pb 2 tb Meto2 Ybda returneaza o reprezentare de tip String pentru obiectul care o apeleaza. Implicit   :2 `breturneaza un Sring sub forma:    2 b  2 `b  2 db  2 hb  2 lb  2 pb 2 tWb ClassName @ 1cc7a0, adica numele clasei urmat de caracterul @ si apoi o valoare in      L2 `+bhexa a codului hash. Pentru a genera o repe O2 c-brezentare mult mai utila putem supraincarca    2 `Sbacesta metoda si returna orice String care sa ne ofere informatii despre obiect. .    2 @b  2 `b -bbaa``՜.+,0 hp  hhometl6   Title  !"#$%&'()*+,-/0123456789:;<=>?@ABCDEFGHJKLMNOPSRoot Entry F@%ȐuU1Table-WordDocument&,SummaryInformation(.@4DocumentSummaryInformation8ICompObjjObjectPool@%Ȑu@%Ȑu  FMicrosoft Word Document MSWordDocWord.Document.89q