Documente Academic
Documente Profesional
Documente Cultură
Introducere in Programare Java
Introducere in Programare Java
ELEMENTE DEFINITORII SPECIFICE 1.2 DEFINIREA I CREAREA OBIECTELOR 1.2.1 REPREZENTAREA I FORMALIZAREA OBIECTELOR 1.2.2 INSTANIEREA I INIIALIZAREA OBIECTELOR 1.3 INTERACIUNEA CU I NTRE OBIECTE 1.3.1 INVOCAREA I ACCESAREA OBIECTELOR. STRUCTURI DE DATE ORIENTATE OBIECT 1.3.2 OPERAII, PARAMETRI, METODE I VARIABILE INTERNE
2 2 3 3 4 6 6 8 20 20 20
CAPITOLUL 1
Introducere n universul obiectelor
nainte de alte explicaii i dezbateri mai mult sau mai puin academice, fiindc sintagma cel mai des utilizat este modelul obiectual, credem c este util o clarificare din capul locului a nelesului ct de ct formal sau mcar att ct se poate la acest moment, asupra acestei noiuni. Modelul obiectual reprezint un model de abstractizare i formalizare a soluiilor software la probleme din diverse domenii (n particular i domeniul economic), avnd la baz conceptul de obiect. Domeniul concret, abstractizat n contextul software, l vom numi domeniul afacerii, iar formalizarea acestuia avnd la baz conceptele legate de obiect o vom numi modelul orientat obiect al afacerii. Dincolo de elementele revoluionare n domeniul proiectrii i programrii pe care le promoveaz fa de abordarea structurat, promotorii modelului obiectual au avut n vedere o deschidere ct mai larg spre construirea unor structuri ct mai flexibile din punct de vedere semantic. Prin urmare, pe lng obiectivul creterii productivitii ca urmare a reutilizrii (de la nivelul structurilor conceptuale pn la componentele software concrete), modelul obiectual ncearc s pun la dispoziie un instrumentar care s compatibilizeze ct mai bine abstraciunile din contextul software cu cele din domeniul problemei reale. De altfel, latura semantic constituie unul din factorii cheie ai proliferrii modelului orientat obiect, n special n sfera problemelor legate de implementarea a ceea ce generic este indicat prin logica afacerii, la fel ca i n cazul mediilor vizuale1 care au revoluionat dezvoltarea aplicaiilor prin valorificarea orientrii lor obiectuale.
Prin medii vizuale putem nelege nu doar instrumente pentru construirea grafic a interfeelor utilizator, ci inclusiv pentru proiectarea aplicaiilor (vezi instrumentele CASE) sau asamblarea funcional a componentelor reutilizabile (un exemplu mai recent este cadrul de lucru OpenBlocks, http://dspace.mit.edu/handle/1721.1/41550, rencarnat n Google App Inventor, http://appinventor.googlelabs.com/about/).
Anexe
Anexe o anume reprezentare (imagine) n contextul din care fac parte, cu alte cuvinte s poat fi descrise o anumit utilitate, adic s-i asume anumite responsabiliti, s s manifeste anumite comportamente de interes, o anumit nclinaie ctre socializare, prin urmare posbilitatea formrii de comuniti de obiecte, cu alte cuvinte obiectele ar trebui s fie capabile s se manifeste colectiv.
A treia ntrebare ndreptit spre a lmuri rolul obiectelor ar fi: Ce fac obiectele? se pot asocia, pot forma structuri (compun obiecte de nivel superior), colaboreaz, pentru a-i ndeplini responsabilitile proprii sau colective. Cu alte cuvinte, se cunosc: anumite obiecte au cunotin de existena altor obiecte, i, mai mult, pot comunica ntre ele, eventual pentru a-i cere ajutorul. Pe parcursul capitolului curent i, mai ales, a celor ce urmeaz vom constata c exist mai multe categorii de obiecte sau c obiectele pot fi caracterizate n mai multe moduri, ntre care: obiecte active i obiecte pasive; obiecte procesate i obiecte de control (care gestioneaz desfurarea unui flux de activiti); obiecte entiti i obiecte servicii; obiecte grafice i obiecte ale afacerii; obiecte generice i obiecte derivate; obiecte simple i obiecte compuse; obiecte persistente i obiecte tranziente.
Anexe 3. comportament, modul de manifestare a obiectelor ca urmare a interaciunii cu alte obiecte; 4. interaciuni, pentru a descrie schimbul de mesaje: cereri i rspunsuri, n contextul realizrii colaborrilor. Limbajele de modelare orientate obiect, cum este UML3, folosesc pentru a reprezenta aceste concepte elemente specifice cum ar fi: 1. atribut, proprietate sau caracteristic informaional a unui obiect; 2. operaie, a. sarcin de care poate fi responsabil, tie s o duc la ndeplinire sau tie s o realizeze, deci o asum, un obiect; b. cerere care poate fi adresat, pe care o poate satisface sau de care poate rspunde un obiect; 3. mesaj, baza comunicrii cererilor i schimbului de informaii ntre obiecte; 4. legtur sau relaie, cale sau canal de comunicare; 5. navigabilitate, direcie de comunicare.
Tabelul 1.1 Sumar al cadrului conceptual pe care se fundamenteaz modelele orientate obiect
Comportament Interaciuni
Cmp sau variabil de instan Legtur sau relaie i Referin navigabilitate Operaie Metod Mesaj Invocare, apel sau acces
Limbajele de progamare orientate obiect folosesc, pentru a materializa (sau implementa) aceste concepte, elemente specifice cum ar fi: 1. cmp sau variabil de instan, pentru materializarea concret a unui atribut; 2. metod, modul de realizare concret a unei sarcini sau modul de pregtire concret a rspunsului la o cerere; 3. invocare, apel sau access, transmiterea concret a unui mesaj; 4. referin, reprezentnd un canal de comunicare direct.
Anexe
Fundamental n formalizarea obiectelor, n majoritatea limbajelor de modelare (UML) sau implementare (Java, C#, C++), este conceptul de clas. Formal, o clas reprezint descrierea unui set de obiecte care partajeaz aceleai atribute, operaii, relaii i semantic (UML). Definirea obiectelor prin intermediul claselor comport ns cteva nuanri: n modelare, clasa este mai aproape de conceptul de tip, adic n sensul definiiei de mai sus: set de obiecte avnd aceleai caracteristici (expun aceeai semantic); n privina limbajelor de programare, clasele se formeaz de fapt dintr-un ansamblu de specificaii: declaraii de membri atribute i operaii; blocuri de implementare a operaiilor sau metode; metode de iniializare a obiectelor sau constructori.
Anexe Pentru a simplifica enunurile de mai sus, atuci cnd am conceptualizat obiectele, am spus c acestea ar trebui s-i asume un set de responsabiliti, de fapt aceste responsabiliti se vor materializa sub forma atributelor i operaiilor. O responsabilitate reprezint o obligaie, o ndatorire, a obiectelor unei clase. La nivelul cel mai abstract, atributele i operaiile corespunztoare unei clase sunt de fapt caracteristicile prin care sunt realizate sau ndeplinite responsabilitile obiectelor acesteia: un atribut reprezint o proprietate, calificat prin nume, care descrie un domeniu (range) de valori ce pot fi reinute sau stocate de ctre instanele respectivei proprieti, o operaie reprezint definiia unui serviciu care poate fi cerut oricrui obiect dintr-o clas (implementat printr-o metod intern, specific).
// Listing 1.1: Structuri OO din domeniul contabil //-------------------------------------------------------public class Cont { String cod; String denumire; // membru static static String numeOrganizatie; } //-------------------------------------------------------public class InregistrareContabila { Integer id; Integer nrOrdine; String tip; // domeniu legal: debit, credit Double suma; // membru referin Cont cont; } //-------------------------------------------------------public class OperatiuneContabila { String debit = "Debit"; String credit = "Credit"; Integer idOperatiune;
Anexe
java.util.Date dataContabilizare; // membru referin multiplicitate > 1 InregistrareContabila[] inregistrari; }
Odat cu instanierea unui obiect nou are loc, de regul, i iniializarea atributelor sau variabilelor de instan care formeaz starea noului obiect. Iniializarea variabilelor de instan se face difereniat funcie de: natura tipului membrilor: primitive sau non-primitive; scopul variabilelor de instan: membri statici sau non-statici.
Anexe
// Listing 1.3: Iniializare membri, statici i non-statici //-------------------------------------------------------public class TestCreareObiecte { public static void main(String[] args){ Cont.numeOrganizatie = "Gama SA"; Cont c_411 = new Cont(); c_411.cod = "411"; c_411.denumire = Clienti"; System.out.println(c_411.getClass() + : c_411 [" + c_411.cod + , + c_411.denumire + , + c_411.numeOrganizatie + ]"); Cont c_401 = new Cont(); c_401.cod = 401"; c_401.denumire = Furnizori"; System.out.println(c_401.getClass() + : c_401 [" + c_401.cod + , + c_401.denumire + , + c_401.numeOrganizatie + ]"); InregistrareContabila i1 = new InregistrareContabila(); i1.id = 1; i1.nrOrdine = 1; i1.tip = Debit"; i1.suma = 120.0; System.out.println(i1.getClass() + : i1 [" + i1.id + , + i1.tip + , + i1.suma + ]"); InregistrareContabila i2 = new InregistrareContabila(); i2.id = 2; i2.nrOrdine = 1; i2.tip = Credit"; i2.suma = 120.0; System.out.println(i2.getClass() + : i2 [" + i2.id + , + i2.tip + , + i2.suma + ]"); OperatiuneContabila o = new OperatiuneContabila(); o.idOperatiune = 1; o.dataContabilizare = new java.util.Date();// data curenta System.out.println(o.getClass() + : o [" + o.idOperatiune + , + o.dataContabilizare + ]"); } }
Anexe n Java, iniializarea implicit respect urmtoarele reguli: membrii primitivi sunt iniializai: cu 0 pentru primitive numerice, cu 0 sau spaiu pentru primitive char, cu false pentru primitive boolean; membrii referine sunt iniializai astfel nct le va fi rezervat zona de memorie necesar pentru stocarea referinelor ctre alte obiecte, fr ns a se obine i o referin efectiv, obinuindu-se s se afirme c sunt iniializai cu null.
// Listing 1.4: Iniializare membrii primitivi vs. referine //-------------------------------------------------------public class TestCreareObiecte { public static void main(String[] args){ Cont.numeOrganizatie = Gama SA"; Cont c_411 = new Cont(); c_411.cod = 411"; c_411.denumire = Clienti"; System.out.println(c_411.getClass() + : c_411 [" + c_411.cod + , + c_411.denumire + , + c_411.numeOrganizatie + ]"); Cont c_5121 = new Cont(); c_5121.cod = 5121"; c_5121.denumire = Cont banca"; System.out.println(c_5121.getClass() + : c_401 [" + c_5121.cod + , + c_5121.denumire + , + c_5121.numeOrganizatie + ]"); InregistrareContabila i1 = new InregistrareContabila(); i1.id = 1; i1.nrOrdine = 1; i1.tip = Debit"; i1.suma = 120.0; System.out.println(i1.getClass() + : i1 inainte [" + i1.id + , + i1.tip + , + i1.cont + , + i1.suma + ]"); i1.cont = c_411; System.out.println(i1.getClass() + : i1 dupa [" + i1.id + , + i1.tip + , + i1.cont.cod + , + i1.suma + ]"); InregistrareContabila i2 = new InregistrareContabila();
10
Anexe
i2.id = 2; i2.nrOrdine = 1; i2.tip = Credit"; i2.suma = 120.0; System.out.println(i2.getClass() + : i2 inainte [" + i2.id + , + i2.tip + , + i2.cont + , + i2.suma + ]"); i2.cont = c_5121; System.out.println(i2.getClass() + : i2 dupa [" + i2.id + , + i2.tip + , + i2.cont.cod + , + i2.suma + ]"); OperatiuneContabila o = new OperatiuneContabila(); o.idOperatiune = 1; o.dataContabilizare = new Date(); // data curenta System.out.println(o.getClass() + ": o [" + o.idOperatiune + , + o.dataContabilizare + ]"); } } //-------------------------------------------------------Rezultat: //-------------------------------------------------------class app.model.contabilitate.Cont: c_411 [411, Clienti, Gama SA] class app.model.contabilitate.Cont: c_401 [5121, Cont banca, Gama SA] class app.model.contabilitate.InregistrareContabila: i1 inainte [1, Debit, null, 120.0] class app.model.contabilitate.InregistrareContabila: i1 dupa [1, Debit, 411, 120.0] class app.model.contabilitate.InregistrareContabila: i2 inainte [2, Credit, null, 120.0] class app.model.contabilitate.InregistrareContabila: i2 dupa [2, Credit, 5121, 120.0] class app.model.contabilitate.OperatiuneContabila: o [1, Sun Jan 10 17:22:59 EET 2010]
Iniializarea explicit a membrilor referine se refer la instanierea obiectelor n procesul de iniializare a variabilelor de instan. n mod practic, dou condiii trebuie ndeplinite: crearea unei metode-constructor care s preia drept argumente valorile ce vor fi utilizate pentru iniializarea explicit;
11
nume_var_ref = new NumeClas(argumente); // Listing 1.5: Iniializare explicit // membrii primitivi vs. referine //-------------------------------------------------------public class Cont { String cod; String denumire; static String numeOrganizatie; public Cont() { } public Cont(String cod, String denumire) { this.cod = cod; this.denumire = denumire; } } //-------------------------------------------------------public class InregistrareContabila { Integer id; Integer nrOrdine; String tip; // debit, credit Double suma; Cont cont; public InregistrareContabila() { } public InregistrareContabila(Integer id, Integer nrOrdine, String tip, Double suma, Cont cont) { this.id = id; this.nrOrdine = nrOrdine; this.tip = tip; this.suma = suma; this.cont = cont; } //--------------------------------------------------------
12
Anexe
public class OperatiuneContabila { static String debit = Debit"; static String credit = Credit"; Integer idOperatiune; Date dataContabilizare; InregistrareContabila[] inregistrari; public OperatiuneContabila() { } public OperatiuneContabila(Integer idOperatiune, Date dataContabilizare, InregistrareContabila[] inregistrari) { this.idOperatiune = idOperatiune; this.dataContabilizare = dataContabilizare; this.inregistrari = inregistrari; } }
//-------------------------------------------------------public class TestCreareObiecte2 { public static void main(String[] args){ Cont.numeOrganizatie = Gama SA"; Cont c_411 = new Cont("411", Clienti"); System.out.println(c_411.getClass() + : c_411 [" + c_411.cod + , + c_411.denumire + , + c_411.numeOrganizatie + ]"); Cont c_5121 = new Cont("5121", Cont banca"); System.out.println(c_5121.getClass() + : c_401 [" + c_5121.cod + , + c_5121.denumire + , + c_5121.numeOrganizatie + ]"); InregistrareContabila i1 = new InregistrareContabila(1, 1, Debit", 120.0, c_411); System.out.println(i1.getClass() + : i1 [" + i1.id + , + i1.tip + , + i1.cont.cod + , + i1.suma + ]"); InregistrareContabila i2 = new InregistrareContabila(1, 1, Credit", 120.0, c_5121); System.out.println(i2.getClass() + : i2 [" +
13
Anexe
i2.id + , + i2.tip + , + i2.cont.cod + , + i2.suma + ]"); OperatiuneContabila o = new OperatiuneContabila(1, new Date(), null); System.out.println(o.getClass() + : o [" + o.idOperatiune + , + o.dataContabilizare + ]"); } }
n structura unui obiect, din punct de vedere conceptual, un membruvariabil de instan este caracterizat i prin multiplicitate (pe lng nume i tip, aa cum am artat mai sus). Practic vorbind, n cazul limbajului Java, atunci cnd un membru-variabil de instan trebuie s gestioneze mai multe valori de acelai tip, ceea ce nseamn c din punct de vedere conceptual este vorba de o multiplicitate > 1, atunci, varianta cea mai direct presupune c acel membru va fi de fapt de tip array.
n fapt, un tablou este o instan, un obiect, provenit dintr-o clas care permite gestionarea indexat a mai multor valori de acelai tip. Pentru aflarea dimensiunii (numrului de elemente) tablourile prezint proprietatea intrinsec length. Procesul de iniializare a unui tablou presupune urmtoarele etape: iniializarea tabloului n sine - n aceast etap va fi specificat numrul de elemente care vor forma tabloul, i iniializarea elementelor care formeaz tabloul (sau rubricilor tabloului).
// Listing 1.5: Exemplu iniializare tablou //-------------------------------------------------------public class TestCreareObiecte3 { public static void main(String[] args){
14
Anexe
Cont.numeOrganizatie = Gama SA"; Cont c_411 = new Cont("411", Clienti"); Cont c_5121 = new Cont("5121", Cont banca"); // Declarare tablou InregistrareContabila[] inregistrariContabile; // Iniializare tablou inregistrariContabile = new InregistrareContabila[2]; // Iniializare explicit a elementelor inregistrariContabile[0] = new InregistrareContabila(1, 1, Debit", 120.0, c_411); inregistrariContabile[1] = new InregistrareContabila(1, 1, Credit", 120.0, c_5121); OperatiuneContabila o = new OperatiuneContabila(1, new Date(), inregistrariContabile); System.out.println(o.getClass() + : o [" + o.idOperatiune + , + o.dataContabilizare + , + o.inregistrari.length + ]"); } } //-------------------------------------------------------Rezultat: //-------------------------------------------------------class app.model.contabilitate.OperatiuneContabila: o [1, Sun Jan 10 17:41:24 EET 2010, 2]
Sintaxa limbajului Java, permite reprezentarea procesului de iniializare n dou moduri: 1) iniializarea separat a tabloului i a elementelor, vezi exemplul de mai sus; 2) iniializarea n aceeai instruciune a tabloului i elementelor, vezi exemplul care urmeaz.
// Listing 1.6: Rafinare iniializare tablou //-------------Varianta 1 ----------------------------public class TestCreareObiecte4 { public static void main(String[] args){ Cont.numeOrganizatie = Gama SA";
15
Anexe
Cont c_411 = new Cont("411", Clienti"); Cont c_5121 = new Cont("5121", Cont banca"); InregistrareContabila[] inregistrariContabile = { new InregistrareContabila(1, 1,"Debit", 120.0, c_411), new InregistrareContabila(2, 1,"Credit", 120.0, c_5121) }; OperatiuneContabila o = new OperatiuneContabila(1, new Date(), inregistrariContabile); System.out.println(o.getClass() + : o [" + o.idOperatiune + , + o.dataContabilizare + , + o.inregistrari.length + ]"); // parcurgere elemente tablou for (InregistrareContabila i : o.inregistrari){ System.out.println(i.getClass() + : i [" + i.id + , + i.tip + , + i.cont.cod + , + i.suma + ]"); } } } //-------------Varianta 2 ----------------------------public class TestCreareObiecte5 { public static void main(String[] args){ Cont.numeOrganizatie = Gama SA"; Cont c_411 = new Cont("411", Clienti"); Cont c_5121 = new Cont("5121", Cont banca"); OperatiuneContabila o = new OperatiuneContabila(1, new Date(), new InregistrareContabila[]{ new InregistrareContabila(1, 1,"Debit", 120.0, c_411), new InregistrareContabila(2, 1, "Credit", 120.0, c_5121) } ); System.out.println(o.getClass() + : o [" + o.idOperatiune + , + o.dataContabilizare + , +
16
Anexe
o.inregistrari.length + ]"); // parcurgere elemente tablou for (int i = 0; i < o.inregistrari.length; i++){ System.out.println(o.inregistrari[i].getClass() + ": i" + i + [" + o.inregistrari[i].id + ", + o.inregistrari[i].tip + , + o.inregistrari[i].cont.cod + ", + o.inregistrari[i].suma + ]"); } } }
17
Anexe
// Listing 1.7: Exemplu iniializare list //-------------------------------------------------------public class OperatiuneContabila { static String debit = Debit"; static String credit = Credit"; Integer idOperatiune; Date dataContabilizare; List<InregistrareContabila> inregistrari = new ArrayList<InregistrareContabila>(); // fata de: InregistrareContabila[] inregistrari public OperatiuneContabila() { } public OperatiuneContabila(Integer idOperatiune, Date dataContabilizare, List<InregistrareContabila> inregistrari) { this.idOperatiune = idOperatiune; this.dataContabilizare = dataContabilizare; this.inregistrari = inregistrari; } } //-------------------------------------------------------public class TestCreareObiecte_6 { public static void main(String[] args){ Cont.numeOrganizatie = Gama SA"; Cont c_411 = new Cont("411", Clienti"); Cont c_5121 = new Cont("5121", Cont banca"); List<InregistrareContabila> inregistratiContabile = new ArrayList<InregistrareContabila>(); inregistratiContabile.add(new InregistrareContabila(1, 1,"Debit", 120.0, c_411)); inregistratiContabile.add(new InregistrareContabila(2, 1,"Credit", 120.0, c_5121)); OperatiuneContabila o = new OperatiuneContabila(1, new Date(),inregistratiContabile); System.out.println(o.getClass() + : o [" + o.idOperatiune + , + o.dataContabilizare +
18
Anexe
", + o.inregistrari.size() + ]"); for (InregistrareContabila i : o.inregistrari){ System.out.println(i.getClass() + : i [" + i.id + , + i.tip + , + i.cont.cod + , + i.suma + ]"); } } }
19
Anexe
Invocarea aceleai operaii ctre obiecte distincte poate conduce la rezultate distincte: execuia operaiei se face n contextul de stare distinct, propriu fiecrui obiect. Invocarea operaiilor presupune anumite pre-condiii: mai nti trebuie s existe obiectele: obiectele trebuie instaniate; obiectele trebuie s fie adresabile (s poat fi accesate referinele lor n contextul din care vor fi invocate); obiectele trebuie s prezinte operaii invocabile (vizibile).
Anexe Metodele reprezint formal blocuri de instruciuni care: pe de o parte descriu algoritmul despre cum anume concret sau funcional, se comport un obiect invocat prin numele unei operaii; pe de alt parte sunt executate ca urmare a invocrii operaiilor crora i este ataate ca specificaii de implemenare.
De multe ori termenii de operaie i metod sunt folosii interschimbabil. Cu preponderen n contextul claselor se folosete termenul metode, iar n contextul interfeelor se folosete termenul operaii. Acetia reprezint totui concepte diferite, operaia reprezint doar o specificaie de interaciune, formatul mesajelor de interaciune, iar metodele reprezint formele concrete de re-aciune a obiectelor la aceste mesaje. Pe scurt, spunem c metodele reprezint implementarea operaiilor. Structurilele specifice care pot forma blocul de instruciuni ce concretizeaz o metod constau n: structuri de date: variabile interne; invocarea variabilelor de instan, declarate la nivelul clasei; parametri; structuri de control: alternative, simple sau generalizate; repetitive; recursive.
// Listing 1.8: Sintaxa structurilor specifice limbajului Java if (<expr-boolean>){ <bloc de instruciuni> } else if { <bloc de instruciuni> } else { <bloc de instruciuni> }// end if ------------------------------------switch <expresie evaluabil la valori int sau Integer>{ case <valoare int/Integer> : {
21
Anexe
<bloc de instruciuni> } break; case <valoare int/Integer> : { <bloc de instruciuni> } break; // in lips va continua i evaluarea // celorlalte ramuri introduse prin valori int/Integer .. ... ... default <valoare int/Integer> : { <bloc de instruciuni> } break; }// end switch ------------------------------------while (<expr-boolean>) { <bloc de instruciuni> break; // prsire bloc while continue; // salt la iteraia urmtoare <bloc de instruciuni> }// end while ------------------------------------for (<iniializare increment>; <expr-boolean>; <expr-incrementare>){ <bloc de instruciuni> break; continue; <bloc de instruciuni> }// end for simplu ------------------------------------for (<iniializare var parcurgere elemente> : <nume tablou sau colecie>){ <bloc de instruciuni> break; continue; <bloc de instruciuni> }// end for parcurgere colecie ------------------------
Un tip de metode speciale, care nu sunt asociate n mod concret unei operaii explicite, al crui nume este de fapt numele clasei, sunt metodele constructor. Nefiind reprezentarea unei operaii, care eventual ar putea face parte din specificaia unei interfee, invocarea unui constructor se face prin cuvntul cheie new i numele clasei.
22
Anexe
// Listing 1.9: Exemplu iniializare list //------------------------------------------------------public class ServiciuOperatiuni { //declaratie operatie public Double getSold(OperatiuneContabila o) { // start metoda implementare operaie return getDebit(o) - getCredit(o); } // sfrit metoda implementare operaie public Double getDebit(OperatiuneContabila o //parametru ){ Double debit = 0.0; // variabila intern for (InregistrareContabila i: o.inregistrari){ if (i.tip == OperatiuneContabila.debit) debit += i.suma; } return debit; } public Double getCredit(OperatiuneContabila o){ Double credit = 0.0; for (InregistrareContabila i: o.inregistrari){ if (i.tip == OperatiuneContabila.debit) credit += i.suma; } return credit; } } //-------------------------------------------------------public class TestCreareObiecte_7 { public static void main(String[] args){ Cont.numeOrganizatie = Gama SA"; Cont c_411 = new Cont("411", Clienti"); Cont c_5121 = new Cont("5121", Cont banca"); List<InregistrareContabila> inregistratiContabile = new ArrayList<InregistrareContabila>(); inregistratiContabile.add( new InregistrareContabila(1, 1, "Debit", 120.0, c_411)); inregistratiContabile.add( new InregistrareContabila(2, 1, "Credit", 120.0, c_5121));
23
Anexe
OperatiuneContabila o = new OperatiuneContabila(1, new Date(), inregistratiContabile); ServiciuOperatiuni s = new ServiciuOperatiuni(); Double sold = s.getSold(o); // invocare operatie System.out.println(o.getClass() + : o [" + o.idOperatiune + , + o.dataContabilizare + ", + sold = + sold + ]"); for (InregistrareContabila i : o.inregistrari){ System.out.println(i.getClass() + : i [" + i.id + , + i.tip + , + i.cont.cod + , + i.suma + ]"); } } } //-------------------------------------------------------Rezultat //-------------------------------------------------------class app.model.contabilitate.OperatiuneContabila: o [1, Sun Jan 10 18:27:19 EET 2010, sold = 0.0] class app.model.contabilitate.InregistrareContabila: i [1, Debit, 411, 120.0] class app.model.contabilitate.InregistrareContabila: i [2, Credit, 5121, 120.0]
24