Sunteți pe pagina 1din 57

1

Desing patternul Proxy.


Proxy: Un obiect substitut, transmis in locul unui obiect real, pentru a furniza prelucrari aditionale inainte de a
transmite operatiile catre obiectul real Dynamic proxy: se creaza obiectul proxy dinamic si se trateaza
apelurile catre metodele proxied in mod dinamic
Design patternul Strategy:
-Crearea unei metode care sa aib comportament diferit in functie de tipul argumentului care se prezinta la
intrare; -Metoda contine o parte fixa care este apelata de fiecare data si o parte care variaz (strategia); -In cazul
in care nu se utilizeaz interfetele, dac dorim s aplicm metoda (strategia) unui obiect dintr-o clas care nu
face parte din ierarhie, nu se poate; - => in exemplul Apply si Procesor, exista o cuplare foarte puternica intre
metoda Apply.proces si clasa Procesor, astfel incat aceasta metoda nu poate fi aplicata decat obiectelor din
ierarhia Procesor, si nicidecum altor obiecte din alte ierarhii; Procesor se creaza ca si o interfata, iar clasele care
doresc sa faca parte din strategie vor implementa interfata scrisa
Design patternul Adapter:
-se scrie cod care preia la intrare interfata existenta si care sa produca interfata de care este nevoie in program; Prin decuplarea interfetei de implementare se permite ca o interfata sa fie aplicata mai multor implementari, deci
codul devine mult mai facil de reutilizat
Design patternul FactoryMethod:
-in loc sa se apeleze un constructor in mod direct, pentru crearea unui obiect se apeleaza o metoda de creere a
obiectului dintr-o clasa Factory. Clasa Factory implementeaza o interfata care specifica metoda de creere; Astfel, se poate schimba la runtime o implementare a unei functionalitati cu alta
Control frameworks: -Application framework: un set de clase proiectate sa rezolve un tip anume de problem
(design patternul Template Method); -Pentru aplicarea application framework se mostenesc din clasele de
baza si se schimba implementarea prin overriding; -Codul suprascris este cel care customizeaza solutia la cazul
particular; -Template Method: contine structura de baza a algoritmului, iar partile specifice sunt apeluri la
metode care pot fi override; -Astfel, se separa partile neschimbate ale algoritmului de cele flexibile; -Control
framework: un tip particular de application framework prin care sistemul raspunde la evenimentele generate
(sistem event-driven) de exemplu GUIs; -In implementarea Control framework, inner class sunt utilizate pentru
a exprima diversele actiuni (metoda action)
Design patternul Decorator:
-Decoratorul trebuie sa aiba aceasi interfata cu obiectele decorate; -Decoratorul poate s extinda interfata acestor
obiecte; -Clasele Filter sunt radacina abstracta a claselor de decorator
Obiect: un obiect are o stare, un comportament si o identitate
Clas: set de obiecte cu caracteristici i funcionalitate identice (termenul de clasa se substituite termenului de
tip)
Intefaa: metode (funcionalitate): cererile care pot fi adresate unui obiect particular dintr-o clasa
Implementarea: mod concret de realizare a funcionalitii
Motenire: o clas nou se aseamn (extinde) o clas existent
Mostenire cum se diferentiaza clasa derivata de clasa de baza? -Prin adaugare de noi metode suplimentare;
-Schimbarea comportamentului unor metode existente in clasa de baza (overriding); -Relatia is-a: clasa derivata
doar override metode din clasa de baza (principiul substitutiei pure); -Relatia is-like-a: clasa derivata adauga
elemente noi interfetei clasei de baza (metodele noi nu sunt accesibile din clasa de baza substitutia nu mai este
pura)

Mosternirea multipla: -In Java se poate extinde o singura clas si se pot implementa oricate clase; -Rolul
interfetelor: sa se poata face upcast la mai mult decat o clasa de baza; Daca se poate crea o clasa de baza fara
definitii de metode si variabile membre, se recomanda sa se creeze interfete in locul claselor abstracte; Interfetele se pot combina (se extinde interfetele la fel ca si clasele); -Coliziunea numelor la implementarea mai
multor interfete (daca interfetele de baza au acelasi nume de metoda cu semnaturi diferite): este o problema daca
metodele difera doar prin tip de return => eroare la compilare; -Campurile care sunt inserate intr-o interfata
devin in mod automat statis si final => reprezinta un mod convenabil pentru a defini constante (similar cu enum);
-Campurile definite in interfete nu pot fi blank finals, ele trebuie initializate la definire
Containere: Necesare datorita faptului ca nu stim de la design numarul de obiecte necesare pentru a rezolva o
anumita problema; -Containerele sunt siruri de referinte catre alte obiecte; -Ele se expandeaza automat pentru a
salva noi obiecte, dupa necesitati; -2 tipuri de liste: ArrayList, LinkedList; -Containerele in Java sunt create sa
pastreze obiecte de tipul Object. -> ele pot salva orice; -Pot aparea exceptii la Downcast la runtime, timp de
executie crescut datorit operaiei de Downcast
Crearea obiectelor si ciclul de viata:
-Fiecare obiect necesita resurse (memorie), crearea si distrugerea obiectelor devin importante; -Java utilizeaza in
mod exclusiv alocarea dinamica a memoriei; -Pentru orice obiect, trebuie utilizat new la creeere; -Obiectele
sunt alocate in zona de heap; -Distrugerea obiectelor este realizata automat de catre garbage collector; -GC
identific momentul in care un obiect nu mai este utilizat i il dezaloc
Organizarea memoriei in Java: -Zona Registru: registrele procesorului, nu avem access direct la ele; -Stiva:
zona de stiva memoreaza referintele catre obiecte; -Heap: in aceasta zona sunt alocate toate obiectele (la apelul
new); -Spatiu de stocare non-RAM: obiecte care exista in afara spatiului de memorie a programului
(persistenta obiectelor)
Siruri (Arrays) in Java; -limbaj de programare orientat safety; -La crearea unui Array se creaza un sir de
referinte fiecare initializata la valoarea null; - => fiecare membru al sirului trebuie initializat; -Java nu permite
utilizarea unui indice in afara range-ului array-ului (se arunca o exceptie)
Clase::
class ATypeName { /* class body */}Clasele contin:-Campuri; -Metode Modul de accesare a unui
camp/metoda objectReference.member Pentru datele din tipuri primitive se garanteaza initializarea la valori
implicite (false si 0)Metode, argumente si tip de return ReturnType methodName(/* argument list */) { /*
method body*/}
Operatori:
-Toti operatorii produc o valoare prin aplicarea lor; -Ei pot produce si side-effects (modificarea valorii
operanzilor); -Aliasing: la transmiterea unui obiect ca si argument intr-o metoda, se transmite o referinta, deci
modificarea valorii in metoda afecteaza valoarea obiectului din afara metodei; -Operatorii ++ si au forma
postfixata si prefixata; -Operatorii == si =! Aplicati pe referinte de obiecte, compara referintele, si nu continutul
obiectelor
Garbage collector-ul dezaloca memoria alocata prin new, atunci cand obiectele nu mai sunt folosite; -colecteaza
memoria ramasa alocata in obiectele care nu mai sunt utilizate si compacteaza heap-ul, rearanjand obiectele
alocate; -Stop-and-copy: GC-ul opreste programul, scaneaza toate referintele de pe stack si copiaza obiectele
identificate in noul heap. Ceea ce ramane e garbage-ul care trebuie dezalocat, iar noul heap e deja compactat

Metoda finalize: -permite operatii de stergere inainte ca obiectele sa fie supuse garbage collectorului; -Java nu
garanteaza apelarea acestei metode, programatorul nu are control asupra momentului cand se apeleaza garbage
collectorul; -Finalize se utilizeaza in general pentru a implementa termination conditions pentru un obiect (de
exemplu inchiderea unui fisier)
Specificatorii de access public, private, protected:
-Access la nivel de package: accesul implicit al membrilor care nu au nici un specificator; -Pentru clasele din
afara package-ului, acesti membrii sunt considerati private; -Access public: orice clasa de oriunde poate accesa
membrul respective; -Clasele mostenite: pot accesa membrii protected din clasa de baza, ca si cum acestia ar fi
membrii public; -Membrii private: pot fi accesati doar in clasa in care au fost definite; -Interfata claselor: public;
-Implementarea functionalitatilor: private
Sintaxa mostenirii:
-Mostenirea se realizeaz ori de cte ori se creaz o clas: se motenete din Object; -Mostenire: clasa nou se
aseamn cu clasa veche: cuvntul cheie extends; -Clasa nou va prelua automat toate campurile i metodele din
clasa de baz; -Regul nescris la mostenire: cmpurile din clasele de baz se scriu private iar metodele se las
public (sau protected);
-Clasa derivat poate s preia o metod din clasa de baz si s o rescrie; -Din
clasa derivat, pentru a se apela o metod din clasa de baz se poate utiliza super; -Realizarea mostenirii: la
crearea obiectului din clasa derivat, se creaz un subobiect din clasa de baz (ca si cum ar fi realizat o
compozitie ctre acesta); -Initializarea subobiectului din clasa de baz: doar prin constructor;
-Constructorul
clasei de baz este apelat intotdeauna inaintea constructorului clasei derivate; -Pentru apel constructor al cl de
baz cu argumente: super ( argumente)
Final:
itemii final: nu pot fi schimbate ( de exemplu, intr-o clas derivata); -Datele final: Constante la compilare care nu
se schimba ulteriorValori initializate la runtime care nu se doreste sa fie schimbateStatic final: au o singur
locatie de stocare a datei; -Final aplicat la o referinta: face referinta constant, valoarea obiectului poate fi
modificata; -Blank final: campuri declarate final care nu sunt initializate -> ele trebuie initializate inainte de
utilzare; -Argumente final: n metod nu se poate schimba valoarea ctre care arat referinta; -Metode final: nu
pot fi schimbate prin mostenire; -Metodele final sunt tratate inline de ctre compilator; -Clase final: se inhib
mostenirea din clasa respectiv
Mecanismul upcast:
-Asocierea dintre numele metodei si corpul metodei legare (binding); -Early binding: atunci cand legarea se
face la compilare; -Late binding: atunci cand legarea se face la executie, exact inainte de executia efectiva a
metodei; -Late binding = dynamic binding sau runtime binding; -Late binding: necesit un mecanism pentru
identificarea tipului la executie (RTTI) pentru a se identifica in mod corect corpul metodei care trebuie apelat; In Java se utilizeaza late binding pentru orice apel de metod, cu exceptia metodelor static si final (private e
implicit final pt ca o metoda private nu poate fi mostenita);
-Campurile si elementele static sunt rezolvate
la compilare; -Legarea constructorilor este realizata la compilare
Is-a vs. Is-like-a:
-Relatie de mostenire de tip is-a: clasa derivat doar suprascrie interfaa clasei de baz; -Relatie de mostenire de
tip is-like-a: clasa derivat contine metode suplimentare fa de clasa de baz; -Relaia de substituie: La o relatie
de tip is-a substitutia este pur: orice mesaj trimis clasei derivate poate fi trimis si clasei de baz (rezolvarea
mesajului se face prin upcast) La o relaie de tip is-like-a: partea extins din clasa derivat nu mai este
disponibil prin upcast (prin adresarea clasei de baz);
-Downcast: operaia invers upcast nu este o
operaie garantat, in sensul in care nu stim exact clasa derivat ctre care se face downcast; -Java verific orice
conversie (cast), si daca nu se poate realiza se arunc o exceptie de tipul ClassCastException
Clase abstracte:
3

-Rolul clasei Instrument (varful ierarhiei): s creeze o interfa comun claselor derivate; - => obiectele din clasa
Instrument nu au sens (dpdv logic); - => clasa Instrument: clas abstract; -Pentru a evita astfel de erori la
executie exist un mecanism prin care se declar clasele abstracte: cuvantul cheie abstract; -Clas abstract: are
cel putin o metod abstract (metod declarat abstract si care nu are corp); -Se genereaz eroare la compilare
dac se incearc crearea unui obiect dintr-o clas abstract; -La mostenire dintr-o clas abstract, metoda
abstract trebuie suprascris, altfel clasa derivat devine si ea abstract
Inner classes:
-Se plaseaza clase in interiorul altor clase; -Inner classes reprezinta un concept diferit de compozitie; -De obicei,
clasa exterioara are o metoda care returneaza un obiect din clasa inner; -Tipul obiectului din clasa interioara se
specifica precum: OuterClass.InnerClass; -Obiectul clasei interioare are un link (referinta) catre obiectul clasei
exterioare care l-a creat; -Obiectul clasei interioare poate accesa membrii obiectului clasei exterioare fara ca sa
fie nevoie de calificare (dreptul de a accesa este asupra tuturor obiectelor membre ale clasei exterioare; -Pentru a
se obtine referinta la obiectul clasei exterioare (din obiectul clasei inner) se utilizeaza: OuterType.this ; -Pentru a
crea un obiect din clasa inner pornind de la un obiect din clasa outer se poate utiliza: obiectOuter.new ;- Clasele
inner sunt potrivite pentru a implementa interfete: se realizeaza ascunderea implementarii
Closures & callbacks:
Closure: un obiect apelabil care retine informatie despre domeniul de vizibilitate in care a fost creat (are access
la variabilele din domeniul de vizibilitate unde a fost creat); -=> clasa interioara este un closure (deoarece are o
referinta catre obiectul exterior si poate sa acceseze inclusiv membrii privati ai clasei exterioare)
Callback: un obiect primeste o informatie care va permite sa apelam obiectul initial la un moment ulterior de
timp. Se implementeaza cu clase interioare. Clasa de tip Closure furnizeaza o poat n intriorul clasei exteriore
(dar intr-un mod safe nu se necesit ca sa transformam accesul la metodele acestei clase)
Iteratori:Este un design pattern; -Un obiect de tip iterator este asociat unei colectii si permite regasirea ordonata a
obiectelor din colectia respective; -Metoda iterator() a unei colectii; -Metoda next() a obiectului iterator: produce
urmatorul element din colectie; -Metoda hasNext(): interogheaza daca mai sunt elemente neiterate; -Metoda
remove(): sterge ultimul element iterat din colectie; -Iteratorii pot produce elementele colectiei doar intr-o
singura directive; -ListIterator: furnizat doar de interfata List, poate parcurge elementele colectiei in ambele
directii
Conceptul de exceptie: in domeniul de vizibilitate unde apare eroarea de obicei nu stim cum sa tratam eroarea,
insa stim ca nu putem s continum cu eroarea, astfel c transmitem eroarea spre rezolvare la un domeniu de
vizibilitate exterior
Obiectul Class: -Java realizeaz RTTI prin intermediul obiectului Class; -Acesta contine informatie referitoare
la tip, informatie care poate fi interogat; -Pentru fiecare clas pe care o avem in program, exist un obiect Class
asociat; La compilarea unei noi clase, acest obiect este creat si salvat in fisierul .class; -La crearea unui obiect
dintr-o clas, JVM utilizeaz un subsistem numit class loader; Toate clasele sunt incarcate in mod dinamic de
ctre JVM la prima utilizare a acestora (anume cand se face prima referinta la un membru static al clasei); La
incarcarea unei clase, se verific daca obiectul Class al tipului respectiv este incarcat, daca nu, se identific
fisierul .class pe disc, si octetii acestuia sunt verificati inainte s fie incarcati
Sistemul de I/O intr-un limbaj de programare:
-Sistemul de I/O intr-un limbaj de programare trebuie s fie capabil s trateze:Surse diferite de dispozitive de I/O
(fisiere, consola, conexiuni de retea etc),Tipuri diferite de access la surse (access secvential, access random,
access buffered),Tipuri diferite de lucru cu sursa (binar, la nivel de caracter, la nivel de linie, la nivel de cuvant)
4

Clasa File:- Reprezinta un nume a unui fisier sau unui set de fisiere dintr-un director; -Metoda list() -> produce
un sir de String care reprezinta fisierele referite de obiectul de tip File; -List poate fi invocata utilizand un
Directory Filter, pentru a returna doar acele fisiere pentru care numele respecta un pattern; -Interfata
FilenameFilter: metoda accept primeste la intrare obiectul de tip File si stringul pentru comparare. Metoda list
din File apeleaza metoda accept pentru fiecare fisier din File, iar acesta este inserat in lista doar daca accept
furnizeaza true; -Obiectul File poate fi utilizat ca sa creem/stergem/redenumim un director/fisier sau un
director/fisier cu o intreaga cale; -File poate fi utilizat ca sa citim informatiile referitoare la un fisier/director
Input si Output: -Pentru intrare: clasele InputStream si Reader cu metoda read; -Pentru iesire: clasele
OutputStream si Writer cu metoda write; -Read si write lucreaza pe octeti (sau siruri de octeti); -Toate clasele de
I/O sunt derivate din acestea; -La realizarea efectiva de I/O programatorii creaza insuruiri de obiecte din clasele
de I/O (design patternul Decorator)
Tipuri de InputStream:- ByteArrayInputStream: permite ca un buffer de memorie sa fie utilizat ca si un
InputStream (din buffer se extrag octeti); -StringBufferInputStream: converteste un String intr-un InputStream;
FileInputStream: sursa de intrare e un fisier. Se furnizeaza la construirea obiectului fie un String fie un File; PipedInputStream: este asociat cu un PipedOutputStream (care este furnizat la construirea obiectului).
Implementeaza conceptul de Pipe; -SequenceInputStream: converteste unul sau mai multe InputStream intr-un
singur obiect de tip InputStream (la construire se furnizeaza fie un InputStream, fie un Enumerator de obiecte
InputStream); -FilterInputStream: clasa abstracta, interfata pentru decoratorii care furnizeaza tipuri particulare de
citire
Tipuri de OutputStream: -ByteArrayOutputStream: creaza un buffer de memorie (octeti). Datele scrise sunt
trimise in acest buffer; -FileOutputStream: iesire intr-un fisier. Se construieste obiectul pe baza unui String sau a
unui File; -PipedOutputStream: in conjunctie cu PipedInputStream. Pentru conceptul de Pipe; FilterOutputStream: pentru iesire formatata, se implementeaza functionalitati de scriere
Reader si Writer:- Adauga functionalitate pentru I/O la nivel de caracter sau Unicode; -Clasele sunt adaugate in
ierarhia InputStream si OutputStream deci nu se inlocuieste aceasta ierarhie; -Clase adapter: InputStreamReader
si OutputStreamWriter; -Motivul pentru care au fost create: sa se permita internationalizarea (Unicode lucreaza
cu caractere pe 16 biti); -Recomandare: sa se utilizeze clase de tip Reader si Writer ori de cate ori e posibil; -La
citiri specifice la nivel de octet, sa se utilizeze InputStream si OutputStream
Serializare:- Pastrarea obiectelor dincolo de executia programelor; -Astfel obiectele pot fi recuperate si executia
restartata de la punctul unde a fost oprita anterior; -Orice obiect dintr-o clas care implementeaza Serializable
poate fi convertit in sir de octeti si apoi restaurat; -Persistent: durata de viata a unui obiect exista dincolo de
executia unui program; -Pentru realizarea persistentei, obiectele trebuie serializate / deserializate in mod explicit
(lightweight persistence); -Pentru serializare, se creaz un obiect dintr-un tip OutputStream, acesta este wrap in
interiorul unui ObjectOutputStream si se utilizeaza metoda writeObject; -Serializarea salveaza intreg webul de
obiecte din spatele obiectului serializat; -Tipul unui obiect deserializat: getClass
Externalize: -extinde interfata Serializable; -La obiectele deserializate cu Externalizable, obiectele sunt
construite obisnuit (cu default constructor) si apoi se apeleaza metoda readExternal; -La obiectele Externalizable,
subobiectele componente trebuie serializate manual (in writeExternal) iar la deserializare, ele trebuie recuperate
de pe disc; -La mostenire dintr-o clasa Externalizable, se apeleaza writeExternal si readExternal a clasei de baza
pentru a se asigura serializare / deserializare corecta

Desing patternul Proxy:


1. Proxy: Un obiect substitut, transmis in locul unui obiect real, pentru a furniza prelucrari aditionale inainte
de a transmite operatiile catre obiectul real
5

2. Dynamic proxy: se creaza obiectul proxy dinamic si se trateaza apelurile catre metodele proxied in mod
dinamic
Design patternul Strategy:
1. Crearea unei metode care sa aib comportament diferit in functie de tipul argumentului care se prezinta la
intrare;
2. Metoda contine o parte fixa care este apelata de fiecare data si o parte care variaz (strategia);
3. In cazul in care nu se utilizeaz interfetele, dac dorim s aplicm metoda (strategia) unui obiect dintr-o
clas care nu face parte din ierarhie, nu se poate; - => in exemplul Apply si Procesor, exista o cuplare
foarte puternica intre metoda Apply.proces si clasa Procesor, astfel incat aceasta metoda nu poate fi
aplicata decat obiectelor din ierarhia Procesor, si nicidecum altor obiecte din alte ierarhii; Procesor se
creaza ca si o interfata, iar clasele care doresc sa faca parte din strategie vor implementa interfata scrisa
Design patternul Adapter:
1. Se scrie cod care preia la intrare interfata existenta si care sa produca interfata de care este nevoie in
program;
2. Prin decuplarea interfetei de implementare se permite ca o interfata sa fie aplicata mai multor
implementari, deci codul devine mult mai facil de reutilizat
Design patternul FactoryMethod:
1. In loc sa se apeleze un constructor in mod direct, pentru crearea unui obiect se apeleaza o metoda de
creere a obiectului dintr-o clasa Factory. Clasa Factory implementeaza o interfata care specifica metoda
de creere;
2. Astfel, se poate schimba la runtime o implementare a unei functionalitati cu alta
Control frameworks:
1. Application framework: un set de clase proiectate

sa rezolve un tip anume de problem (design

patternul Template Method); -Pentru aplicarea application framework se mostenesc din clasele de baza
si se schimba implementarea prin overriding;
2. Codul suprascris este cel care customizeaza solutia la cazul particular;
3. Template Method: contine structura de baza a algoritmului, iar partile specifice sunt apeluri la metode
care pot fi override;
4. Astfel, se separa partile neschimbate ale algoritmului de cele flexibile;
6

5. Control framework: un tip particular de application framework prin care sistemul raspunde la
evenimentele generate (sistem event-driven) de exemplu GUIs; -In implementarea Control framework,
inner class sunt utilizate pentru a exprima diversele actiuni (metoda action)
Design patternul Decorator:
1. Decoratorul trebuie sa aiba aceasi interfata cu obiectele decorate;
2. Decoratorul poate s extinda interfata acestor obiecte;
3. Clasele Filter sunt radacina abstracta a claselor de decorator
Mostenire cum se diferentiaza clasa derivata de clasa de baza?
1. Prin adaugare de noi metode suplimentare;
2. Schimbarea comportamentului unor metode existente in clasa de baza (overriding);
3. Relatia is-a: clasa derivata doar override metode din clasa de baza (principiul substitutiei pure);
4. Relatia is-like-a: clasa derivata adauga elemente noi interfetei clasei de baza (metodele noi nu sunt
accesibile din clasa de baza substitutia nu mai este pura)
Crearea obiectelor si ciclul de viata:
1. Fiecare obiect necesita resurse (memorie), crearea si distrugerea obiectelor devin importante;
2. Java utilizeaza in mod exclusiv alocarea dinamica a memoriei;
3. Pentru orice obiect, trebuie utilizat new la creeere;
4. Obiectele sunt alocate in zona de heap;
5. Distrugerea obiectelor este realizata automat de catre garbage collector;
6. GC identific momentul in care un obiect nu mai este utilizat i il dezaloc
Static:
1. Datele membre si metodele pot fi accesate doar sub calificarea unui obiect cunoscut, existent in memonia
programului (creat cu new).
2. Un camp sau o metoda statica nu este legata de un obiect anume dintr-o clasa;
3. Un camp static exista o singura data pentru o clasa, fiind partajat de catre toate obiectele clasei
respective;
4. Campurile statice pot fi referite prin numele clasei;

5. Metodele statice sunt la nivel de clasa, pot fi referite prin numele clasei fara a fi necesara existenta unui
obiect;
6. Metoda main;
7. Metodele statice nu pot accesa campuri/ metode nestatice din clasa.
8. Blocul static este apelat o singura data, la prima creare a unui obiect din clasa respectiva sau la apelarea
unei membre statice din acea clasa si poate sa initializeze doar date statice.
Operatori:
1. Toti operatorii produc o valoare prin aplicarea lor;
2. Ei pot produce si side-effects (modificarea valorii operanzilor);
3. Aliasing: la transmiterea unui obiect ca si argument intr-o metoda, se transmite o referinta, deci
modificarea valorii in metoda afecteaza valoarea obiectului din afara metodei;
4. Operatorii ++ si au forma postfixata si prefixata;
5. Operatorii == si =! Aplicati pe referinte de obiecte, compara referintele, si nu continutul obiectelor

Garbage collector-ul:
1. dezaloca memoria alocata prin new, atunci cand obiectele nu mai sunt folosite;
2. colecteaza memoria ramasa alocata in obiectele care nu mai sunt utilizate si compacteaza heap-ul,
rearanjand obiectele alocate; -Stop-and-copy:
3. GC-ul opreste programul, scaneaza toate referintele de pe stack si copiaza obiectele identificate in noul
heap. Ceea ce ramane e garbage-ul care trebuie dezalocat, iar noul heap e deja compactat
Sintaxa mostenirii:
1. Mostenirea se realizeaz ori de cte ori se creaz o clas: se motenete din Object;
2. Mostenire: clasa nou se aseamn cu clasa veche: cuvntul cheie extends;
3. Clasa nou va prelua automat toate campurile i metodele din clasa de baz;
4. Regul nescris la mostenire: cmpurile din clasele de baz se scriu private iar metodele se las public
(sau protected);
5. Clasa derivat poate s preia o metod din clasa de baz si s o rescrie;
6. Din clasa derivat, pentru a se apela o metod din clasa de baz se poate utiliza super;

7. Realizarea mostenirii: la crearea obiectului din clasa derivat, se creaz un subobiect din clasa de baz (ca
si cum ar fi realizat o compozitie ctre acesta);
8. Initializarea subobiectului din clasa de baz: doar prin constructor;
9. Constructorul clasei de baz este apelat intotdeauna inaintea constructorului clasei derivate;
10. Pentru apel constructor al cl de baz cu argumente: super ( argumente)
Sintaxa compoziiei:
1. Se plaseaz o referin ctre un obiect nou ntr-o clas nou
2. Referintele nou create se initializeaz la valoarea null -> trebuie initializate explicit
Operatia de delegare:
1. Operatie intermediar intre compozitie si agregare
2. Intr-o clas se plaseaz un obiect membru din a 2-a clas, iar clasa nou va expune toate metodele
furnizate de obiectul din clasa 2-a
3. Pentru realizarea operatiilor de mostenire / compozitie, este suficient ca s se importe clasele reutilizate
(codul lor surs nu este necesar)
Mecanismul upcast:
1. Asocierea dintre numele metodei si corpul metodei legare (binding);
2. Early binding: atunci cand legarea se face la compilare;
3. Late binding: atunci cand legarea se face la executie, exact inainte de executia efectiva a metodei;
4. Late binding = dynamic binding sau runtime binding;
5. Late binding: necesit un mecanism pentru identificarea tipului la executie (RTTI) pentru a se identifica
in mod corect corpul metodei care trebuie apelat;
6. In Java se utilizeaza late binding pentru orice apel de metod, cu exceptia metodelor static si final
(private e implicit final pt ca o metoda private nu poate fi mostenita);
7. Campurile si elementele static sunt rezolvate la compilare;
8. Legarea constructorilor este realizata la compilare
Is-a vs. Is-like-a:
1. Relatie de mostenire de tip is-a: clasa derivat doar suprascrie interfaa clasei de baz;
2. Relatie de mostenire de tip is-like-a: clasa derivat contine metode suplimentare fa de clasa de baz;

10

3. Relaia de substituie: La o relatie de tip is-a substitutia este pur: orice mesaj trimis clasei derivate poate
fi trimis si clasei de baz (rezolvarea mesajului se face prin upcast) La o relaie de tip is-like-a: partea
extins din clasa derivat nu mai este disponibil prin upcast (prin adresarea clasei de baz);
4. Downcast: operaia invers upcast nu este o operaie garantat, in sensul in care nu stim exact clasa
derivat ctre care se face downcast;
5. Java verific orice conversie (cast), si daca nu se poate realiza se arunc o exceptie de tipul
ClassCastException
Containere:
1. Necesare datorita faptului ca nu stim de la design numarul de obiecte necesare pentru a rezolva o anumita
problema;
2. Containerele sunt siruri de referinte catre alte obiecte;
3. Ele se expandeaza automat pentru a salva noi obiecte, dupa necesitati;
4. 2 tipuri de liste: ArrayList, LinkedList;
5. Containerele in Java sunt create sa pastreze obiecte de tipul Object. -> ele pot salva orice;
6. Pot aparea exceptii la Downcast la runtime, timp de executie crescut datorit operaiei de Downcast
Cuvantul cheie this:
1. In fiecare metoda apelata, referinta obiectului sub care se apeleaza metoda este transmisa in metoda sub
forma referintei this
2. this poate fi utilizat doar in interiorul metodelor ne-statice
3. In interiorul unei metode dinstr-o clasa, la apelul unei metode din clasa curenta, nu este nevoie sa se
utilizeze this
4. This este frecvent utilizat in return, pentru a returna obiectul curent
Clase abstracte:
1. Dintr-o clasa abstracta nu se poate instantia nu se poate instantia si foloseste doar la dezvoltarea
ulterioara a unor clase ce descriu obiecte concrete;
2. Pot contine obiecte fara nici o implementare;
3. Este definita prin cuvantul cheie abstract;
4. Pune la dispozitia subclaselor un model complet pe care sa-l implementeze;
5. Nu se pot crea obiecte din clasa abstract = > eroare la compilare;
10

11

6. Are cel putin o metoda abstracta, care se implementeaza in toate subclasele.


Interfete:
1. Se implementeaza si metodele nu au bloc;
2. O clasa care implementeaza o interfata trebuie obligatoriu sa specifice implementari pentru toate
metodele interfetei;
3. O clasa poate implementa mai multe interfete = superinterfete separate prin virgula mostenire multipla;
4. Corpul unei interfete contine variabile constante, implicit static si final care trebuie initializate;
5. Metodele sunt implicit public si nu pot fi declarate cu nici un identificator pblic, private sau protected;
Mosternirea multipla:
1. In Java se poate extinde o singura clas si se pot implementa oricate clase;
2. Rolul interfetelor: sa se poata face upcast la mai mult decat o clasa de baza
3. Daca se poate crea o clasa de baza fara definitii de metode si variabile membre, se recomanda sa se
creeze interfete in locul claselor abstracte; -Interfetele se pot combina (se extinde interfetele la fel ca si
clasele);
4. Coliziunea numelor la implementarea mai multor interfete (daca interfetele de baza au acelasi nume de
metoda cu semnaturi diferite): este o problema daca metodele difera doar prin tip de return => eroare la
compilare;
5. Campurile care sunt inserate intr-o interfata devin in mod automat statis si final => reprezinta un mod
convenabil pentru a defini constante (similar cu enum);
6. Campurile definite in interfete nu pot fi blank finals, ele trebuie initializate la definire.
Inner classes:
1. Se plaseaza clase in interiorul altor clase;
2. Inner classes reprezinta un concept diferit de compozitie;
3. De obicei, clasa exterioara are o metoda care returneaza un obiect din clasa inner;
4. Tipul obiectului din clasa interioara se specifica precum: OuterClass.InnerClass;
5. Obiectul clasei interioare are un link (referinta) catre obiectul clasei exterioare care l-a creat;
6. Obiectul clasei interioare poate accesa membrii obiectului clasei exterioare fara ca sa fie nevoie de
calificare (dreptul de a accesa este asupra tuturor obiectelor membre ale clasei exterioare;

11

12

7. Pentru a se obtine referinta la obiectul clasei exterioare (din obiectul clasei inner) se utilizeaza:
OuterType.this ;
8. Pentru a crea un obiect din clasa inner pornind de la un obiect din clasa outer se poate utiliza:
obiectOuter.new ;
9. Clasele inner sunt potrivite pentru a implementa interfete: se realizeaza ascunderea implementarii
Clase interioare anonime:
1. Sunt clase interioare fara nume (clase create direct la momentul utilizarii lor)
2. finalizeaza constructia instructiunii care contine definitia clasei anonime
3. Campurile din clasele anonime pot fi initializate cu valori din afara (din domeniul unde se creaza clasa)
4. Daca intr-o clasa anonima se doreste a fi utilizat un argument (sau o valoare) definita in afara acesteia,
atunci referinta acesteia trebuie sa fie final
5. Clasele anonime nu pot avea constructor, dar initializarile se pot realiza in blocul non-static de initializare
6. Clasele interioare pot fi create static (nested classes) daca nu se doreste utilizarea referintei obiectului
exterior in interiorul clasei inner
7. Clasele interioare parte a unei interfete devin automat static public. Rol: crearea de cod comun care sa fie
utilizat de toate implementarile interfetei
8. Oricat de adanca este imbricarea claselor nested, acestea pot accesa obiectele membre din clasele
exterioare, indiferent de nivelul de imbricare
9. La mostenire dintr-o clasa inner, trebuie furnizat la constructia obiectului un obiect din clasa inner, pentru
a se permite construirea sub-obiectului cl. baza ( enclosingClassReference.super() )
10. Clasele locale unui domeniu de vizibilitate au access la toate variabilele domeniului respectiv (inclusiv
cele final), insa aceste clase nu au specificator de access
Closure:

un obiect apelabil care retine informatie despre domeniul de vizibilitate in care a fost creat (are access la
variabilele din domeniul de vizibilitate unde a fost creat); -=> clasa interioara este un closure (deoarece
are o referinta catre obiectul exterior si poate sa acceseze inclusiv membrii privati ai clasei exterioare)

Callback:

un obiect primeste o informatie care va permite sa apelam obiectul initial la un moment ulterior de timp.
Se implementeaza cu clase interioare. Clasa de tip Closure furnizeaza o poat n intriorul clasei exteriore
(dar intr-un mod safe nu se necesit ca sa transformam accesul la metodele acestei clase)
12

13

Iteratori:
1. Este un design pattern;
2. Un obiect de tip iterator este asociat unei colectii si permite regasirea ordonata a obiectelor din colectia
respective;
3. Metoda iterator() a unei colectii;
4. Metoda next() a obiectului iterator: produce urmatorul element din colectie;
5. Metoda hasNext(): interogheaza daca mai sunt elemente neiterate;
6. Metoda remove(): sterge ultimul element iterat din colectie;
7. Iteratorii pot produce elementele colectiei doar intr-o singura directive;
8. ListIterator: furnizat doar de interfata List, poate parcurge elementele colectiei in ambele directii
Obiectul Class:
1. Java realizeaz RTTI prin intermediul obiectului Class;
2. Acesta contine informatie referitoare la tip, informatie care poate fi interogat;
3. Pentru fiecare clas pe care o avem in program, exist un obiect Class asociat; La compilarea unei noi
clase, acest obiect este creat si salvat in fisierul .class;
4. La crearea unui obiect dintr-o clas, JVM utilizeaz un subsistem numit class loader;
5. Toate clasele sunt incarcate in mod dinamic de ctre JVM la prima utilizare a acestora (anume cand se
face prima referinta la un membru static al clasei);
6. La incarcarea unei clase, se verific daca obiectul Class al tipului respectiv este incarcat, daca nu, se
identific fisierul .class pe disc, si octetii acestuia sunt verificati inainte s fie incarcati
Sistemul de I/O intr-un limbaj de programare:

Sistemul de I/O intr-un limbaj de programare trebuie s fie capabil s trateze:Surse diferite de dispozitive
de I/O (fisiere, consola, conexiuni de retea etc),Tipuri diferite de access la surse (access secvential, access
random, access buffered),Tipuri diferite de lucru cu sursa (binar, la nivel de caracter, la nivel de linie, la
nivel de cuvant)

Clasa File:
1. Reprezinta un nume a unui fisier sau unui set de fisiere dintr-un director;
2. Metoda list() -> produce un sir de String care reprezinta fisierele referite de obiectul de tip File;
13

14

3. List poate fi invocata utilizand un Directory Filter, pentru a returna doar acele fisiere pentru care numele
respecta un pattern;
4. Interfata FilenameFilter: metoda accept primeste la intrare obiectul de tip File si stringul pentru
comparare. Metoda list din File apeleaza metoda accept pentru fiecare fisier din File, iar acesta este
inserat in lista doar daca accept furnizeaza true;
5. Obiectul File poate fi utilizat ca sa creem/stergem/redenumim un director/fisier sau un director/fisier cu o
intreaga cale;
6. -File poate fi utilizat ca sa citim informatiile referitoare la un fisier/director
Input si Output:
1. Pentru intrare: clasele InputStream si Reader cu metoda read;
2. Pentru iesire: clasele OutputStream si Writer cu metoda write;
3. Read si write lucreaza pe octeti (sau siruri de octeti);
4. Toate clasele de I/O sunt derivate din acestea; -La realizarea efectiva de I/O programatorii creaza
insuruiri de obiecte din clasele de I/O (design patternul Decorator)

Tipuri de InputStream:
1. ByteArrayInputStream: permite ca un buffer de memorie sa fie utilizat ca si un InputStream (din buffer
se extrag octeti);
2. StringBufferInputStream: converteste un String intr-un InputStream;
3. FileInputStream: sursa de intrare e un fisier. Se furnizeaza la construirea obiectului fie un String fie un
File;
4. PipedInputStream: este asociat cu un PipedOutputStream (care este furnizat la construirea obiectului).
Implementeaza conceptul de Pipe;
5. SequenceInputStream: converteste unul sau mai multe InputStream intr-un singur obiect de tip
InputStream (la construire se furnizeaza fie un InputStream, fie un Enumerator de obiecte InputStream);
6. FilterInputStream: clasa abstracta, interfata pentru decoratorii care furnizeaza tipuri particulare de citire
Tipuri de OutputStream:
1. ByteArrayOutputStream: creaza un buffer de memorie (octeti). Datele scrise sunt trimise in acest buffer;
2. FileOutputStream: iesire intr-un fisier. Se construieste obiectul pe baza unui String sau a unui File;
14

15

3. PipedOutputStream: in conjunctie cu PipedInputStream. Pentru conceptul de Pipe;


4. FilterOutputStream: pentru iesire formatata, se implementeaza functionalitati de scriere

Reader si Writer:
1. Adauga functionalitate pentru I/O la nivel de caracter sau Unicode;
2. Clasele sunt adaugate in ierarhia InputStream si OutputStream deci nu se inlocuieste aceasta ierarhie;
3. Clase adapter: InputStreamReader si OutputStreamWriter;
4. Motivul pentru care au fost create: sa se permita internationalizarea (Unicode lucreaza cu caractere pe 16
biti);
5. Recomandare: sa se utilizeze clase de tip Reader si Writer ori de cate ori e posibil;
6. La citiri specifice la nivel de octet, sa se utilizeze InputStream si OutputStream
Serializare:
1. Pastrarea obiectelor dincolo de executia programelor;
2. Astfel obiectele pot fi recuperate si executia restartata de la punctul unde a fost oprita anterior;
3. Orice obiect dintr-o clas care implementeaza Serializable poate fi convertit in sir de octeti si apoi
restaurat;
4. Persistent: durata de viata a unui obiect exista dincolo de executia unui program;
5. Pentru realizarea persistentei, obiectele trebuie serializate / deserializate in mod explicit (lightweight
persistence);
6. Pentru serializare, se creaz un obiect dintr-un tip OutputStream, acesta este wrap in interiorul unui
ObjectOutputStream si se utilizeaza metoda writeObject;
7. Serializarea salveaza intreg webul de obiecte din spatele obiectului serializat; -Tipul unui obiect
deserializat: getClass

Externalize:
1. extinde interfata Serializable;
2. La obiectele deserializate cu Externalizable, obiectele sunt construite obisnuit (cu default constructor) si
apoi se apeleaza metoda readExternal;

15

16

3. La obiectele Externalizable, subobiectele componente trebuie serializate manual (in writeExternal) iar la
deserializare, ele trebuie recuperate de pe disc;
4. La mostenire dintr-o clasa Externalizable, se apeleaza writeExternal si readExternal a clasei de baza
pentru a se asigura serializare / deserializare corecta
RTTI:
1. Run-Time Type Identification
2. Descoperirea tipului la executie si utilizarea acestuia
3. 2 tipuri de RTTI:
-Traditional la compilare
-Reflection: - la executie !!!
4. Upcast: necesit realizarea automata a RTTI pentru invocarea automat (polimorfic) a metodei
suprascrise
5. Prin RTTI se poate identifica tipul exact al unui obiect la executie (limbajul de programare are metode
pentru a realiza acest lucru)
Final:
1. declara ca o clasa nu poate accesa subclase
2. declararea are 2 scopuri:

securitate : unele metode pot astepta ca parametru un obiect al unei clase si nu al unei sublcase, dar tipul
exact al unui obiect nu poate fi aflat cu exactitate decat in momentul executiei

programare in spirit orientat obiect: o clasa perfecta nu trebuie sa aiba subclase

Finalize:

Este o metoda ce se implementeaza in vederea oricarui tip ce incapsuleaza o resursa negestionata, care
trebuie sa suporte finalizarea, adica GC determina ca un obiect trebuie eliminate din memorie si apeleaza
metoda Finalize care ofera resursei eliberarea corecta, colectarea acesteia

Executia unui bloc Try-Catch-Finally:


16

17

1. Un bloc try este urmat de mai multe blocuri catch si optional de un bloc finally
2. Blocul try-catch sta la baza sistemului de tratare a erorilor, o portiune de cod nu poate fi
monitrizata pentru tratarea exceptiilor, fara a fi inclusa intr-un astfel de bloc
3. Daca o exceptie este aruncata in blocul try, aceasta este prinsa in blocul catch corespunzator, dupa
care blocul acelui catch se executa
4. Finally este folosit atunci cand dorim ca anumite portiuni de cod sa se execute indifferent daca
blocul try s-a executat normal sau a generat o exceptie => blocul finally se executa indifferent de
modul in care blocul try si-a terminat executia
Clauza throws:
1. Daca o metoda contine cod care ar putea genera o exceptie, si totusi, in cadrul metodei nu exista un
cod try-catch care sa prinda acea exceptie => metoda trebuie sa specifice prin clauza throws ca poate
genera acea exceptie
2. Nu se supun acestei reguli exceptiile care sunt subclase ale claselor Error si RunTimeException
Clauza throw:

Pentru a genera manual o exceptie in urma unei stari pe care o consideram eronata, folosim cuvantul
cheie throw;

Polimorfism:
1. Acelasi nume se poate referi la 2 metode diferite.
2. Este de 2 feluri:

Overriding metoda cu acceasi semnatura cu o alta din clasa parinte;

Overriding doua sau mai multe metode in acelasi clasa cu acelasi nume, dar semnaturi diferite.

Organizarea codului:
1. Pentru fiecare clasa compilata se produce un fisier .class
2. Un program este compus dintr-o colectie de fisiere .class
3. Acestea pot fi arhivate: fisier .jar
4. Fiecare fisier .java incepe cu mentiunea package: se indica numele packageului din care vor face parte
clasele
5. Clasele utilizate care fac parte din alt package se importa cu import
17

18

6. Toate clasele dintr-un package vor fi colectate intr-un singur subdirector


7. Conventie pentru denumirea packageurilor: utilizarea domeniilor de internet in ordine inversa
8. Calea root pentru directorare: variabila sistem CLASSPATH
9. CLASSPATH poate include directoare sau fisiere .jar
1. Ce este o clasa java si cum se salveaza pe disk?
Clas: set de obiecte cu caracteristici i funcionalitate identice (termenul de clasa se substituite termenului
de tip)
O clasa reprezinta o modalitate de a descrie un nou tip de date. Clasa este o descriere a unei multimi de
obiecte caracterizate prin structuri si comportamente similare. De aceea, o clasa va cuprinde definitiile
datelor si operatiilor ce caracterizeaza obiectele clasei respective.
Datele definite intr-o clasa se mai numesc atribute, iar operatiile se mai numesc metode sau functiimembru. Atributele si metodele formeaza membrii unei clase.
Sintaxa folosita pentru a defini o clasa in Java este:
class nume_clasa {
// date si metode
}
Salvarea pe disk se face in folderul built cu numele clasei si extensia .class
2. Ce este un package?
Un package grupeaza toate clasele , Utilizate pentru organizarea claselor . Packageurile pot si comprimate
sub forma jar.

3. Defineste final, finally finalize.

Final- o clasa declarata cu final nu poate fi subclasata. O clasa declarata ca final opreste linia de mostenire, nu
se poate extinde o clasa finala. O metoda declarata cu final nu poate fi suprascrisa.O variabila declarata cu final
poate fi initializata numai o singura data. Utilizata in special pentru mostenire
Finally- Blocul declarat cu finally se executa mereu dupa try and catch atunci cand apare o exceptie neasteptata
sau fara a fi o exceptie.Este utilizat pentru a evita . Ajuta programatorul sa evite curatarea codului accidentala
prin return break sau continue.
Finalize-este o metoda care daca este prezenta intr-o clasa este apelata inaintea garbage collectorului. Metoda
finalize() este utilizata pentru curatarea codului inainte ca un obiesct sa fie luat de garbage colector
18

19


4. Defineste variabila locala, variabila membra si variabila de clasa
Variabile de instan. Sunt unice fiecrei instane le clasei.
Variabile de clas. O singur copie pentru toate instanele clasei. Se folosete modificatorul de acces static.
Variabile locale. Variabile temporare declarate n cadrul unei metode sau a unui bloc. Sunt vizibile doar n cadrul
acelei metode.
Parametri. Variabilele prin care se trimit argumente la apelul metodelor.
variabile de Instanta (atribute) aceste variabile definesc valorile unui obiect, deci, ele sunt create atunci cnd
obiectul este creat; ele exista de cnd obiectul este creat si pana cand acesta este distrus; doar obiectul si
metodele sale au acces la variabilele de instanta;
variabilele statice aceste variabile sunt parte dintr-o clasa; sunt create atunci cnd clasa este incarcata de
JVM;
variabile locale ale unor metode aceste variabile sunt definite pe stiva metodei si ele exista atta timp ct
metoda este executata (exista in stiva de apeluri); variabilele locale nu pot fi accesate si din interiorul unor
metode imbricate chiar daca ele exista cand metoda imbricata este executata
variabile locale unui bloc de cod - aceste variabile sunt definite in interiorul blocurilor de cod (intre { si }) si
poate fi utilizate in timp ce blocul este executat; blocuri de cod sunt tipice pentru, for, while si blocuri de
initializare.
Variablie membre- sunt declarate in cadrul unei clase, dar apartin unui obiect.


5. Defineste private, protected , public
Private: elementele private pot fi accesate doar de creatorul clasei in cadrul metodelor acelei clase
- folosit in declararea unui camp sau a unei metode dintr-o clasa - specifica faptul ca membrul sau metoda
respectiva poate fi accesata doar din cadrul clasei insesi, nu si din clasele derivate din aceasta clasa.
Public: elementele publice sunt disponibile oricaror alte clase
Protected: similar cu private, utilizat in mostenire, clasele care mostenesc pot accesa elementele private din
clasele de baza
-folosit in declararea unui camp sau a unei metode dintr-o clasa - specifica faptul ca membrul sau metoda
respectiva poate fi accesata doar din cadrul clasei insesi sau din clasele derivate din aceasta clasa.
19

20


6. Rolul claselor de tip Filter
Un filtru este un obiect de a efectua sarcini de filtrare pe fiecare cerere, la o resurs (cu un coninut de servlet
sau statice), sau pe rspunsul la o resurs, sau ambele.
Exemplele care au fost identificate pentru acest design sunt
1) Filtre de autentificare
2) exploatarea forestier i Audit filtre
3) de conversie fotografie filtre
4) Filtre de compresie a datelor
5) Filtrele de criptare
6) Filtre Tokenizing
7) Filtre care declanseaza resurse de acces evenimente
8) XSL / T filtre
9) Mime-Tip filtru lan
Clasele Filter sunt radacina abstracta a claselor de decorator

7. Design patternul Iterator

8. Descrieti modul de utilizare a Decoratorilor la realizarea i/o in java

9. Care este diferenta intre o clasa abstracta si o interfata
O interfata defineste un set de metode, proprietati, evenimente, indexatori. Acesti membri vor fi
implementati de o clasa sau chiar de o structura.
O clasa abstracta este o clasa care nu poate fi instantiata si este folosita pentru mostenire.
O clasa care nu este abstracta si care deriveaza dintr-o clasa abstracta, trebuie sa includa implementarile
tuturor membrilor abstracti.

10. Descrieti mecanismul try-catch-finally
try {
// codul care este susceptibil sa genereze exceptie
} catch (Type1 tp1) {
// exceptii de tipul Type1
20

21

} catch (Type2 tp2) {


// exceptii de tipul Type2
}
finally {
// cod care se executa indiferent de tipul de exceptie aruncat (sau nu)
}
Try catch functioneaza ca un switch pe tipul de exceptie
2 modalitati de tratare a erorilor
n Termination: eroarea este aruncata
n Resumption: se insereaza cod try catch pt rezolvarea erorii
Blocul "try" contine instructiunile de deschidere a unui fisier si de citire dintr-un fisier ambele putnd produce
exceptii. Exceptiile provocate de aceste instructiuni sunt tratate n cele doua blocuri "catch", cte unul pentru
fiecare tip de exceptie.
Inchiderea fisierului se face n blocul "finally", deoarece acesta este sigur ca se va executa. Fara a folosi blocul
"finally" nchiderea fisierului ar fi trebuit facuta n fiecare situatie n care fisierul ar fi fost deschis, ceea ce ar fi
dus la scrierea de cod redundant:

11. Descrieti modulele de creare a obiectelor din tipul claselor interioare care nu sunt anonimie
Clasa interioar este necesar numai clasei exterioare. Pentru reducerea numrului de clase de nivel superior si
pentru simplificarea comunicrii ntre clasele asculttor la evenimente putem defini clasele receptor ca niste
clase interioare cu nume, incluse n clasa cu fereastra aplicatiei:

class MFrame extends JFrame {
JButton b1 = new JButton (" + ");
JButton b2 = new JButton (" - ");
JTextField text = new JTextField (6);
int n= 0;
public MFrame() {
Container c = getContentPane();
b1.addActionListener (new B1L());
b2.addActionListener (new B2L());
c.setLayout (new FlowLayout());
c.add(b1); c.add(b2);
text.setText(" "+n);
c.add (text);
}
// clase incluse cu nume
21

22

class B1L implements ActionListener {


public void actionPerformed (ActionEvent ev) {
text.setText(" "+ ++n);
}
}
class B2L implements ActionListener {
public void actionPerformed (ActionEvent ev) {
text.setText(" "+ --n);
}
}
Definirea de clase incluse anonime reduce si mai mult lungimea programelor, dar
ele sunt mai greu de citit si de extins


12. Fie un system formal definit pe alfabetul format din literele a si b.Limbajul format accepta doar cuvinte
care se incheie cu aab.Sa se scrie automatul finit determinist pentru acest limbaj si reprezentarea
limbajului in BNF.

13. Descrieti modaliatea de realizare a unui iterator si incercati sa furnizati un exemplu concret de
utilizare a acestui sablon de programare

Un iterator este un obiect care permite traversarea unei colectii si modificarea acesteia (ex:
stergere de elemente) in mod selectiv. Puteti obtine un iterator pentru o colectie, apeland metoda sa
iterator(). Interfata Iterator este urmatoarea:

public interface Iterator<E> {
boolean hasNext();
E next();
void remove(); // optional
}
Metodele au urmatorul comportament:

hasNext -intoarce true daca mai exista elemente neparcurse inca de iteratorul respectiv
next -intoarce urmatorul element
remove -elimina din colectie ultimul element intors de next. In mod evident, remove nu poate fi apelat
decat o singura data dupa un apel next. Daca aceasta regula nu este respectata, vom primi o eroare.
Ne putem imagina ca un iterator se pozitioneaza intre elementele colectiei. Initial, cursorul sau precede
primul element, astfel ca primul apel next va intoarce primul element.

Atentie: Metoda remove este singura modalitate SIGURA de a inlatura un element dintr-o colectie in
timpul parcurgerii acesteia. Orice alta metoda are un comportament neprecizat (nu putem garanta ca
stergerea va avea loc, sau ca elementul sters va fi cel pe care chiar doream sa-l stergem).

Este util sa folosim iteratori cand dorim: stergerea elementului curent, in timpul iterarii
Cand dorim sa iteram mai multe colectii in paralel.
22

23



Exemplu de folosire a unui iterator:
Collection c = new ArrayList();
Iterator it = c.iterator();

while (it.hasNext()) {
//verificari asupra elementului curent: it.next();
it.remove();
}

14. Ce inseamna upcast? Descrieti mecanismul legarii intarziate si cum faciliteaza acest mecanism
realizarea proprietatii de upcast.

Proprietatea de upcast presupune tratarea unui obiect dintr-o clasa derivata ca si cum ar fi din
clasa de baz.

Legare (binding) = asocierea dintre numele metodei si corpul metodei. Late binding necesita un
mecanism pt identificarea tipului la executie(RTTI), pt a se identifica in mod corect corpul metodei care
trebuie apelat. In cazul late binding, legarea se face la executie, exact inainte de executia efectiva a
metodei. Se utilizeaza late binding pt orice apel de metoda, cu exceptia metodelor static si final.

15. Care este rolul constructorului de copiere in cazul agregarii indirecte?
Constructorul este o metod special apelat automat la instanierea unei clase i face operaiile
necesare pentru iniializarea fiecrui obiect al unei clase fie ea static sau dinamic. Dac se folosete
pentru a iniializa un obiect cu alt obiect atunci denumirea de constructor de copiere.
Agregarea este relatia intre doua obiecte in care unul dintre obiecte apartine celuilalt obiect. Agregarea
reda apartenta unui obiect la un alt obiect.

Din punct de vedere conceptual, exista 2 tipuri de agregare:
strong la disparitia obiectelor continute prin agregare, existenta obiectului container inceteaza (de
exemplu, o carte nu poate exista fara pagini)
weak obiectul-container poate exista si in absenta obiectelor agregate (de exemplu, o biblioteca poate
exista si fara carti)
agregare indirect ?
16. Care este diferenta intre colectiile generice, heterogene si parametrizate?
Colectiile sunt un ansamblu de iterfete si clase ce realizeaza: colectarea impreuna a obiectelor, stocarea,
sortarea si accesarea obiectelor.
Colectii generice putem specifica tipul de data pe care il va folosi colectia,

ex: List<String> strings
Colectii eterogene atunci cnd se creaz o colecie pentru elemente de acelai tip (necunoscut),
oricine poate insera elemente de alt tip
Colectii parametrizate -
17. Serializarea
Pastrarea obiectelor dincolo de executia programului.
23

24

= transformarea unui obiect intr-o secventa de octeti, din care sa poata fi refacut ulterior obiectul
original. Este un mechanism utilizat pt salvarea si restaurarea datelor.
18. Externalizarea
Ce se intampla daca dorim ca parti din obiect sa nu fie serializate?
Sau dorim s recreem subobiecte de la zero?
Interfata Externalizable: extinde interfata Serializable
2 metode noi: writeExternal, readExternal

Aceste metode sunt apelate automat la serializare / deserializare si contin cod suplimentar care se
executa la aceste operatii

La obiectele deserializate cu Externalizable, obiectele sunt construite obisnuit (cu default constructor) si
apoi se apeleaza metoda readExternal

La obiectele Externalizable, subobiectele componente trebuie serializate manual (in writeExternal) iar la
deserializare, ele trebuie recuperate de pe disc

La mostenire dintr-o clasa Externalizable, se apeleaza writeExternal si readExternal a clasei de baza
pentru a se asigura serializare / deserializare corecta

Evitarea serializarii anumitor componente ale obiectelor

Prima metoda: utilizarea Externalizable


Metoda 2-a: cuvantul cheie transient: indica faptul acel camp marcat cu transient nu va fi serializat ca si
parte a procesului automat de serializare

Metoda 3-a: se adauga la clase metodele writeObject si readObject in care se furnizeaza codul
programatorului pentru serializare
Aceste metode sunt private si sunt apelate automat de catre writeObject si readObject a claselor
ObjectOutputStream si ObjectInputStream
19. Suprancrcarea
Suprancrcarea unei metode (owerloading) este procesul prin care n cadrul unei clase sunt adugate dou
sau mai multe metode cu acelai nume dar cu numr diferit de parametri. n momentul apelrii metodei,
mediul de rulare va ti exact ce metod s apeleze pe baza parametrilor specificai astfel nct nu exista
posibilitate de confuzie si de apelare a unei metode greite.

24

25

20. Cuvntul cheie this


Cuvntul cheie this este folosit n cadrul metodelor atunci cnd se dorete s se aib acces la referina
obiectului curent. Cuvntul cheie this este o referin ctre obiectul curent. Acest cuvnt cheie este folosit
doar n cazurile speciale cnd este nevoie s se fac o referin explicit la obiectul curent. De exemplu n
cazul unei metode care trebuie s returneze obiectul curent.
21. Cuvntul cheie static

Cuvntul cheie static este folosit n java pentru a defini o variabil sau o metod care poate fi accesata prin
intermediul numelui clasei, fr a fi nevoie s se construiasc obiecte de tipul respectiv. n construirea unei
aplicaii orientate pe obiecte utilizarea atributelor sau metodelor statice trebuie s fie evitat i acestea s fie
folosite doar n cazuri de strict necesitate.
22. Clase i metode abstracte
o metod se numete abstract dac este doar declarat i nu definit. Declaraia va conine, obligatoriu,
cuvntul cheie abstract: abstract numemetoda ();

o clas ce conine mcar o metod abstract devine clas abstract i va trebui calificat ca atare (n caz
contrar se produce o eroare de compilare). Fiind o clas incomplet, tentativa de a crea un obiect de tip
abstract, se soldeaz cu eroare.
23. Interfaa
Interfaa acoper noiunea de clas abstract pur. n aceast situaie definiia tipului este precedat de
cuvntul cheie interface, ce va nlocui cuvntul cheie class.
Prin interfa se pune la dispoziie o form i nu o implementare. Ea poate conine:
membri de tip primitiv (implicit statici i finali);
nume de metode crora li se ataeaz:
- lista de argumente de apel;
- tipurile returnate

Desing patternul Proxy.
Proxy: Un obiect substitut, transmis in locul unui obiect real, pentru a furniza prelucrari aditionale inainte de a
transmite operatiile catre obiectul real Dynamic proxy: se creaza obiectul proxy dinamic si se trateaza
apelurile catre metodele proxied in mod dinamic

Design patternul Strategy:
-Crearea unei metode care sa aib comportament diferit in functie de tipul argumentului care se prezinta la
intrare; -Metoda contine o parte fixa care este apelata de fiecare data si o parte care variaz (strategia); -In
cazul in care nu se utilizeaz interfetele, dac dorim s aplicm metoda (strategia) unui obiect dintr-o clas care
nu face parte din ierarhie, nu se poate; - => in exemplul Apply si Procesor, exista o cuplare foarte puternica
intre metoda Apply.proces si clasa Procesor, astfel incat aceasta metoda nu poate fi aplicata decat obiectelor
din ierarhia Procesor, si nicidecum altor obiecte din alte ierarhii; Procesor se creaza ca si o interfata, iar clasele
care doresc sa faca parte din strategie vor implementa interfata scrisa

Design patternul Adapter:
25

26

-se scrie cod care preia la intrare interfata existenta si care sa produca interfata de care este nevoie in
program; -Prin decuplarea interfetei de implementare se permite ca o interfata sa fie aplicata mai multor
implementari, deci codul devine mult mai facil de reutilizat
Design patternul FactoryMethod:
-in loc sa se apeleze un constructor in mod direct, pentru crearea unui obiect se apeleaza o metoda de creere a
obiectului dintr-o clasa Factory. Clasa Factory implementeaza o interfata care specifica metoda de creere; Astfel, se poate schimba la runtime o implementare a unei functionalitati cu alta
Control frameworks: -Application framework: un set de clase proiectate sa rezolve un tip anume de problem
(design patternul Template Method); -Pentru aplicarea application framework se mostenesc din clasele de
baza si se schimba implementarea prin overriding; -Codul suprascris este cel care customizeaza solutia la cazul
particular; -Template Method: contine structura de baza a algoritmului, iar partile specifice sunt apeluri la
metode care pot fi override; -Astfel, se separa partile neschimbate ale algoritmului de cele flexibile; -Control
framework: un tip particular de application framework prin care sistemul raspunde la evenimentele generate
(sistem event-driven) de exemplu GUIs; -In implementarea Control framework, inner class sunt utilizate
pentru a exprima diversele actiuni (metoda action)

Design patternul Decorator:
-Decoratorul trebuie sa aiba aceasi interfata cu obiectele decorate; -Decoratorul poate s extinda interfata
acestor obiecte; -Clasele Filter sunt radacina abstracta a claselor de decorator
Obiect: un obiect are o stare, un comportament si o identitate
Clas: set de obiecte cu caracteristici i funcionalitate identice (termenul de clasa se substituite termenului de
tip)
Intefaa: metode (funcionalitate): cererile care pot fi adresate unui obiect particular dintr-o clasa
Implementarea: mod concret de realizare a funcionalitii
Motenire: o clas nou se aseamn (extinde) o clas existent

Mostenire cum se diferentiaza clasa derivata de clasa de baza? -Prin adaugare de noi metode suplimentare;
-Schimbarea comportamentului unor metode existente in clasa de baza (overriding); -Relatia is-a: clasa derivata
doar override metode din clasa de baza (principiul substitutiei pure); -Relatia is-like-a: clasa derivata adauga
elemente noi interfetei clasei de baza (metodele noi nu sunt accesibile din clasa de baza substitutia nu mai
este pura)






Mosternirea multipla: -In Java se poate extinde o singura clas si se pot implementa oricate clase; -Rolul
interfetelor: sa se poata face upcast la mai mult decat o clasa de baza; Daca se poate crea o clasa de baza fara
definitii de metode si variabile membre, se recomanda sa se creeze interfete in locul claselor abstracte; Interfetele se pot combina (se extinde interfetele la fel ca si clasele); -Coliziunea numelor la implementarea mai
multor interfete (daca interfetele de baza au acelasi nume de metoda cu semnaturi diferite): este o problema
daca metodele difera doar prin tip de return => eroare la compilare; -Campurile care sunt inserate intr-o
interfata devin in mod automat statis si final => reprezinta un mod convenabil pentru a defini constante (similar
cu enum); -Campurile definite in interfete nu pot fi blank finals, ele trebuie initializate la definire
26

27


Containere: Necesare datorita faptului ca nu stim de la design numarul de obiecte necesare pentru a rezolva o
anumita problema; -Containerele sunt siruri de referinte catre alte obiecte; -Ele se expandeaza automat pentru
a salva noi obiecte, dupa necesitati; -2 tipuri de liste: ArrayList, LinkedList; -Containerele in Java sunt create sa
pastreze obiecte de tipul Object. -> ele pot salva orice; -Pot aparea exceptii la Downcast la runtime, timp de
executie crescut datorit operaiei de Downcast
Crearea obiectelor si ciclul de viata:
-Fiecare obiect necesita resurse (memorie), crearea si distrugerea obiectelor devin importante; -Java utilizeaza
in mod exclusiv alocarea dinamica a memoriei; -Pentru orice obiect, trebuie utilizat new la creeere; -Obiectele
sunt alocate in zona de heap; -Distrugerea obiectelor este realizata automat de catre garbage collector; -GC
identific momentul in care un obiect nu mai este utilizat i il dezaloc
Organizarea memoriei in Java: -Zona Registru: registrele procesorului, nu avem access direct la ele; -Stiva:
zona de stiva memoreaza referintele catre obiecte; -Heap: in aceasta zona sunt alocate toate obiectele (la
apelul new); -Spatiu de stocare non-RAM: obiecte care exista in afara spatiului de memorie a programului
(persistenta obiectelor)

Siruri (Arrays) in Java; -limbaj de programare orientat safety; -La crearea unui Array se creaza un sir de
referinte fiecare initializata la valoarea null; - => fiecare membru al sirului trebuie initializat; -Java nu permite
utilizarea unui indice in afara range-ului array-ului (se arunca o exceptie)
Clase::
class ATypeName { /* class body */}Clasele contin:-Campuri; -Metode Modul de accesare a unui
camp/metoda objectReference.member Pentru datele din tipuri primitive se garanteaza initializarea la valori
implicite (false si 0)Metode, argumente si tip de return ReturnType methodName(/* argument list */) { /*
method body*/}
Operatori:
-Toti operatorii produc o valoare prin aplicarea lor; -Ei pot produce si side-effects (modificarea valorii
operanzilor); -Aliasing: la transmiterea unui obiect ca si argument intr-o metoda, se transmite o referinta, deci
modificarea valorii in metoda afecteaza valoarea obiectului din afara metodei; -Operatorii ++ si au forma
postfixata si prefixata; -Operatorii == si =! Aplicati pe referinte de obiecte, compara referintele, si nu continutul
obiectelor
Garbage collector-ul dezaloca memoria alocata prin new, atunci cand obiectele nu mai sunt folosite; colecteaza memoria ramasa alocata in obiectele care nu mai sunt utilizate si compacteaza heap-ul, rearanjand
obiectele alocate; -Stop-and-copy: GC-ul opreste programul, scaneaza toate referintele de pe stack si copiaza
obiectele identificate in noul heap. Ceea ce ramane e garbage-ul care trebuie dezalocat, iar noul heap e deja
compactat

Metoda finalize: -permite operatii de stergere inainte ca obiectele sa fie supuse garbage collectorului; -Java nu
garanteaza apelarea acestei metode, programatorul nu are control asupra momentului cand se apeleaza
garbage collectorul; -Finalize se utilizeaza in general pentru a implementa termination conditions pentru un
obiect (de exemplu inchiderea unui fisier)

Specificatorii de access public, private, protected:
-Access la nivel de package: accesul implicit al membrilor care nu au nici un specificator; -Pentru clasele din
afara package-ului, acesti membrii sunt considerati private; -Access public: orice clasa de oriunde poate accesa
membrul respective; -Clasele mostenite: pot accesa membrii protected din clasa de baza, ca si cum acestia ar fi
27

28

membrii public; -Membrii private: pot fi accesati doar in clasa in care au fost definite; -Interfata claselor: public;
-Implementarea functionalitatilor: private

Sintaxa mostenirii:
-Mostenirea se realizeaz ori de cte ori se creaz o clas: se motenete din Object; -Mostenire: clasa nou se
aseamn cu clasa veche: cuvntul cheie extends; -Clasa nou va prelua automat toate campurile i metodele
din clasa de baz; -Regul nescris la mostenire: cmpurile din clasele de baz se scriu private iar metodele se
las public (sau protected); -Clasa derivat poate s preia o metod din clasa de baz si s o rescrie; Din clasa derivat, pentru a se apela o metod din clasa de baz se poate utiliza super; -Realizarea mostenirii: la
crearea obiectului din clasa derivat, se creaz un subobiect din clasa de baz (ca si cum ar fi realizat o
compozitie ctre acesta); -Initializarea subobiectului din clasa de baz: doar prin constructor; Constructorul clasei de baz este apelat intotdeauna inaintea constructorului clasei derivate; -Pentru apel
constructor al cl de baz cu argumente: super ( argumente)
Final:
itemii final: nu pot fi schimbate ( de exemplu, intr-o clas derivata); -Datele final: Constante la compilare care
nu se schimba ulteriorValori initializate la runtime care nu se doreste sa fie schimbateStatic final: au o singur
locatie de stocare a datei; -Final aplicat la o referinta: face referinta constant, valoarea obiectului poate fi
modificata; -Blank final: campuri declarate final care nu sunt initializate -> ele trebuie initializate inainte de
utilzare; -Argumente final: n metod nu se poate schimba valoarea ctre care arat referinta; -Metode final: nu
pot fi schimbate prin mostenire; -Metodele final sunt tratate inline de ctre compilator; -Clase final: se inhib
mostenirea din clasa respectiv
Mecanismul upcast:
-Asocierea dintre numele metodei si corpul metodei legare (binding); -Early binding: atunci cand legarea se
face la compilare; -Late binding: atunci cand legarea se face la executie, exact inainte de executia efectiva a
metodei; -Late binding = dynamic binding sau runtime binding; -Late binding: necesit un mecanism pentru
identificarea tipului la executie (RTTI) pentru a se identifica in mod corect corpul metodei care trebuie apelat;
-In Java se utilizeaza late binding pentru orice apel de metod, cu exceptia metodelor static si final (private e
implicit final pt ca o metoda private nu poate fi mostenita); -Campurile si elementele static sunt
rezolvate la compilare; -Legarea constructorilor este realizata la compilare
Is-a vs. Is-like-a:
-Relatie de mostenire de tip is-a: clasa derivat doar suprascrie interfaa clasei de baz; -Relatie de mostenire
de tip is-like-a: clasa derivat contine metode suplimentare fa de clasa de baz; -Relaia de substituie: La o
relatie de tip is-a substitutia este pur: orice mesaj trimis clasei derivate poate fi trimis si clasei de baz
(rezolvarea mesajului se face prin upcast) La o relaie de tip is-like-a: partea extins din clasa derivat nu mai
este disponibil prin upcast (prin adresarea clasei de baz); -Downcast: operaia invers upcast nu este o
operaie garantat, in sensul in care nu stim exact clasa derivat ctre care se face downcast; -Java verific
orice conversie (cast), si daca nu se poate realiza se arunc o exceptie de tipul ClassCastException
Clase abstracte:
-Rolul clasei Instrument (varful ierarhiei): s creeze o interfa comun claselor derivate; - => obiectele din clasa
Instrument nu au sens (dpdv logic); - => clasa Instrument: clas abstract; -Pentru a evita astfel de erori la
executie exist un mecanism prin care se declar clasele abstracte: cuvantul cheie abstract; -Clas abstract:
are cel putin o metod abstract (metod declarat abstract si care nu are corp); -Se genereaz eroare la
compilare dac se incearc crearea unui obiect dintr-o clas abstract; -La mostenire dintr-o clas abstract,
metoda abstract trebuie suprascris, altfel clasa derivat devine si ea abstract
Inner classes:
28

29

-Se plaseaza clase in interiorul altor clase; -Inner classes reprezinta un concept diferit de compozitie; -De
obicei, clasa exterioara are o metoda care returneaza un obiect din clasa inner; -Tipul obiectului din clasa
interioara se specifica precum: OuterClass.InnerClass; -Obiectul clasei interioare are un link (referinta) catre
obiectul clasei exterioare care l-a creat; -Obiectul clasei interioare poate accesa membrii obiectului clasei
exterioare fara ca sa fie nevoie de calificare (dreptul de a accesa este asupra tuturor obiectelor membre ale
clasei exterioare; -Pentru a se obtine referinta la obiectul clasei exterioare (din obiectul clasei inner) se
utilizeaza: OuterType.this ; -Pentru a crea un obiect din clasa inner pornind de la un obiect din clasa outer se
poate utiliza: obiectOuter.new ;- Clasele inner sunt potrivite pentru a implementa interfete: se realizeaza
ascunderea implementarii
Closures & callbacks:
Closure: un obiect apelabil care retine informatie despre domeniul de vizibilitate in care a fost creat (are access
la variabilele din domeniul de vizibilitate unde a fost creat); -=> clasa interioara este un closure (deoarece are o
referinta catre obiectul exterior si poate sa acceseze inclusiv membrii privati ai clasei exterioare)
Callback: un obiect primeste o informatie care va permite sa apelam obiectul initial la un moment ulterior de
timp. Se implementeaza cu clase interioare. Clasa de tip Closure furnizeaza o poat n intriorul clasei exteriore
(dar intr-un mod safe nu se necesit ca sa transformam accesul la metodele acestei clase)

Iteratori:-
Este un design pattern; -Un obiect de tip iterator este asociat unei colectii si permite regasirea ordonata a
obiectelor din colectia respective; -Metoda iterator() a unei colectii; -Metoda next() a obiectului iterator:
produce urmatorul element din colectie; -Metoda hasNext(): interogheaza daca mai sunt elemente neiterate; Metoda remove(): sterge ultimul element iterat din colectie; -Iteratorii pot produce elementele colectiei doar
intr-o singura directive; -ListIterator: furnizat doar de interfata List, poate parcurge elementele colectiei in
ambele directii

Conceptul de exceptie: in domeniul de vizibilitate unde apare eroarea de obicei nu stim cum sa tratam eroarea,
insa stim ca nu putem s continum cu eroarea, astfel c transmitem eroarea spre rezolvare la un domeniu de
vizibilitate exterior

Obiectul Class: -Java realizeaz RTTI prin intermediul obiectului Class; -Acesta contine informatie referitoare la
tip, informatie care poate fi interogat; -Pentru fiecare clas pe care o avem in program, exist un obiect Class
asociat; La compilarea unei noi clase, acest obiect este creat si salvat in fisierul .class; -La crearea unui obiect
dintr-o clas, JVM utilizeaz un subsistem numit class loader; Toate clasele sunt incarcate in mod dinamic de
ctre JVM la prima utilizare a acestora (anume cand se face prima referinta la un membru static al clasei); La
incarcarea unei clase, se verific daca obiectul Class al tipului respectiv este incarcat, daca nu, se identific
fisierul .class pe disc, si octetii acestuia sunt verificati inainte s fie incarcati

Sistemul de I/O intr-un limbaj de programare:
-Sistemul de I/O intr-un limbaj de programare trebuie s fie capabil s trateze:Surse diferite de dispozitive de
I/O (fisiere, consola, conexiuni de retea etc),Tipuri diferite de access la surse (access secvential, access random,
access buffered),Tipuri diferite de lucru cu sursa (binar, la nivel de caracter, la nivel de linie, la nivel de cuvant)
Clasa File:- Reprezinta un nume a unui fisier sau unui set de fisiere dintr-un director; -Metoda list() -> produce
un sir de String care reprezinta fisierele referite de obiectul de tip File; -List poate fi invocata utilizand un
Directory Filter, pentru a returna doar acele fisiere pentru care numele respecta un pattern; -Interfata
FilenameFilter: metoda accept primeste la intrare obiectul de tip File si stringul pentru comparare. Metoda list
29

30

din File apeleaza metoda accept pentru fiecare fisier din File, iar acesta este inserat in lista doar daca accept
furnizeaza true; -Obiectul File poate fi utilizat ca sa creem/stergem/redenumim un director/fisier sau un
director/fisier cu o intreaga cale; -File poate fi utilizat ca sa citim informatiile referitoare la un fisier/director
Input si Output: -Pentru intrare: clasele InputStream si Reader cu metoda read; -Pentru iesire: clasele
OutputStream si Writer cu metoda write; -Read si write lucreaza pe octeti (sau siruri de octeti); -Toate clasele
de I/O sunt derivate din acestea; -La realizarea efectiva de I/O programatorii creaza insuruiri de obiecte din
clasele de I/O (design patternul Decorator)
Tipuri de InputStream:- ByteArrayInputStream: permite ca un buffer de memorie sa fie utilizat ca si un
InputStream (din buffer se extrag octeti); -StringBufferInputStream: converteste un String intr-un InputStream;
FileInputStream: sursa de intrare e un fisier. Se furnizeaza la construirea obiectului fie un String fie un File; PipedInputStream: este asociat cu un PipedOutputStream (care este furnizat la construirea obiectului).
Implementeaza conceptul de Pipe; -SequenceInputStream: converteste unul sau mai multe InputStream intr-un
singur obiect de tip InputStream (la construire se furnizeaza fie un InputStream, fie un Enumerator de obiecte
InputStream); -FilterInputStream: clasa abstracta, interfata pentru decoratorii care furnizeaza tipuri particulare
de citire
Tipuri de OutputStream: -ByteArrayOutputStream: creaza un buffer de memorie (octeti). Datele scrise sunt
trimise in acest buffer; -FileOutputStream: iesire intr-un fisier. Se construieste obiectul pe baza unui String sau
a unui File; -PipedOutputStream: in conjunctie cu PipedInputStream. Pentru conceptul de Pipe; FilterOutputStream: pentru iesire formatata, se implementeaza functionalitati de scriere
Reader si Writer:- Adauga functionalitate pentru I/O la nivel de caracter sau Unicode; -Clasele sunt adaugate in
ierarhia InputStream si OutputStream deci nu se inlocuieste aceasta ierarhie; -Clase adapter:
InputStreamReader si OutputStreamWriter; -Motivul pentru care au fost create: sa se permita
internationalizarea (Unicode lucreaza cu caractere pe 16 biti); -Recomandare: sa se utilizeze clase de tip Reader
si Writer ori de cate ori e posibil; -La citiri specifice la nivel de octet, sa se utilizeze InputStream si OutputStream

Serializare:- Pastrarea obiectelor dincolo de executia programelor; -Astfel obiectele pot fi recuperate si
executia restartata de la punctul unde a fost oprita anterior; -Orice obiect dintr-o clas care implementeaza
Serializable poate fi convertit in sir de octeti si apoi restaurat; -Persistent: durata de viata a unui obiect exista
dincolo de executia unui program; -Pentru realizarea persistentei, obiectele trebuie serializate / deserializate in
mod explicit (lightweight persistence); -Pentru serializare, se creaz un obiect dintr-un tip OutputStream,
acesta este wrap in interiorul unui ObjectOutputStream si se utilizeaza metoda writeObject; -Serializarea
salveaza intreg webul de obiecte din spatele obiectului serializat; -Tipul unui obiect deserializat: getClass

Externalize: -extinde interfata Serializable; -La obiectele deserializate cu Externalizable, obiectele sunt
construite obisnuit (cu default constructor) si apoi se apeleaza metoda readExternal; -La obiectele
Externalizable, subobiectele componente trebuie serializate manual (in writeExternal) iar la
deserializare, ele trebuie recuperate de pe disc; -La mostenire dintr-o clasa Externalizable, se apeleaza
writeExternal si readExternal a clasei de baza pentru a se asigura serializare / deserializare corecta


Desing patternul Proxy:
1. Proxy: Un obiect substitut, transmis in locul unui obiect real, pentru a furniza prelucrari aditionale
inainte de a transmite operatiile catre obiectul real
30

31

2. Dynamic proxy: se creaza obiectul proxy dinamic si se trateaza apelurile catre metodele proxied in mod
dinamic


Design patternul Strategy:
1. Crearea unei metode care sa aib comportament diferit in functie de tipul argumentului care se
prezinta la intrare;
2. Metoda contine o parte fixa care este apelata de fiecare data si o parte care variaz (strategia);
3. In cazul in care nu se utilizeaz interfetele, dac dorim s aplicm metoda (strategia) unui obiect dintr-o
clas care nu face parte din ierarhie, nu se poate; - => in exemplul Apply si Procesor, exista o cuplare
foarte puternica intre metoda Apply.proces si clasa Procesor, astfel incat aceasta metoda nu poate fi
aplicata decat obiectelor din ierarhia Procesor, si nicidecum altor obiecte din alte ierarhii; Procesor se
creaza ca si o interfata, iar clasele care doresc sa faca parte din strategie vor implementa interfata scrisa

Design patternul Adapter:
1. Se scrie cod care preia la intrare interfata existenta si care sa produca interfata de care este nevoie in
program;
2. Prin decuplarea interfetei de implementare se permite ca o interfata sa fie aplicata mai multor
implementari, deci codul devine mult mai facil de reutilizat

Design patternul FactoryMethod:
1. In loc sa se apeleze un constructor in mod direct, pentru crearea unui obiect se apeleaza o metoda de
creere a obiectului dintr-o clasa Factory. Clasa Factory implementeaza o interfata care specifica metoda
de creere;
2. Astfel, se poate schimba la runtime o implementare a unei functionalitati cu alta
Control frameworks:
1. Application framework: un set de clase proiectate sa rezolve un tip anume de problem (design
patternul Template Method); -Pentru aplicarea application framework se mostenesc din clasele de
baza si se schimba implementarea prin overriding;
2. Codul suprascris este cel care customizeaza solutia la cazul particular;

31

32

3. Template Method: contine structura de baza a algoritmului, iar partile specifice sunt apeluri la metode
care pot fi override;
4. Astfel, se separa partile neschimbate ale algoritmului de cele flexibile;
5. Control framework: un tip particular de application framework prin care sistemul raspunde la
evenimentele generate (sistem event-driven) de exemplu GUIs; -In implementarea Control
framework, inner class sunt utilizate pentru a exprima diversele actiuni (metoda action)


Design patternul Decorator:
1. Decoratorul trebuie sa aiba aceasi interfata cu obiectele decorate;
2. Decoratorul poate s extinda interfata acestor obiecte;
3. Clasele Filter sunt radacina abstracta a claselor de decorator

Mostenire cum se diferentiaza clasa derivata de clasa de baza?
1. Prin adaugare de noi metode suplimentare;
2. Schimbarea comportamentului unor metode existente in clasa de baza (overriding);
3. Relatia is-a: clasa derivata doar override metode din clasa de baza (principiul substitutiei pure);
4. Relatia is-like-a: clasa derivata adauga elemente noi interfetei clasei de baza (metodele noi nu sunt
accesibile din clasa de baza substitutia nu mai este pura)

Crearea obiectelor si ciclul de viata:
1. Fiecare obiect necesita resurse (memorie), crearea si distrugerea obiectelor devin importante;
2. Java utilizeaza in mod exclusiv alocarea dinamica a memoriei;
3. Pentru orice obiect, trebuie utilizat new la creeere;
4. Obiectele sunt alocate in zona de heap;
5. Distrugerea obiectelor este realizata automat de catre garbage collector;
6. GC identific momentul in care un obiect nu mai este utilizat i il dezaloc

Static:
1. Datele membre si metodele pot fi accesate doar sub calificarea unui obiect cunoscut, existent in
memonia programului (creat cu new).
32

33

2. Un camp sau o metoda statica nu este legata de un obiect anume dintr-o clasa;
3. Un camp static exista o singura data pentru o clasa, fiind partajat de catre toate obiectele clasei
respective;
4. Campurile statice pot fi referite prin numele clasei;
5. Metodele statice sunt la nivel de clasa, pot fi referite prin numele clasei fara a fi necesara existenta unui
obiect;
6. Metoda main;
7. Metodele statice nu pot accesa campuri/ metode nestatice din clasa.
8. Blocul static este apelat o singura data, la prima creare a unui obiect din clasa respectiva sau la apelarea
unei membre statice din acea clasa si poate sa initializeze doar date statice.

Operatori:
1. Toti operatorii produc o valoare prin aplicarea lor;
2. Ei pot produce si side-effects (modificarea valorii operanzilor);
3. Aliasing: la transmiterea unui obiect ca si argument intr-o metoda, se transmite o referinta, deci
modificarea valorii in metoda afecteaza valoarea obiectului din afara metodei;
4. Operatorii ++ si au forma postfixata si prefixata;
5. Operatorii == si =! Aplicati pe referinte de obiecte, compara referintele, si nu continutul obiectelor


Garbage collector-ul:
1. dezaloca memoria alocata prin new, atunci cand obiectele nu mai sunt folosite;
2. colecteaza memoria ramasa alocata in obiectele care nu mai sunt utilizate si compacteaza heap-ul,
rearanjand obiectele alocate; -Stop-and-copy:
3. GC-ul opreste programul, scaneaza toate referintele de pe stack si copiaza obiectele identificate in noul
heap. Ceea ce ramane e garbage-ul care trebuie dezalocat, iar noul heap e deja compactat

Sintaxa mostenirii:
1. Mostenirea se realizeaz ori de cte ori se creaz o clas: se motenete din Object;
2. Mostenire: clasa nou se aseamn cu clasa veche: cuvntul cheie extends;
33

34

3. Clasa nou va prelua automat toate campurile i metodele din clasa de baz;
4. Regul nescris la mostenire: cmpurile din clasele de baz se scriu private iar metodele se las public
(sau protected);
5. Clasa derivat poate s preia o metod din clasa de baz si s o rescrie;
6. Din clasa derivat, pentru a se apela o metod din clasa de baz se poate utiliza super;
7. Realizarea mostenirii: la crearea obiectului din clasa derivat, se creaz un subobiect din clasa de baz
(ca si cum ar fi realizat o compozitie ctre acesta);
8. Initializarea subobiectului din clasa de baz: doar prin constructor;
9. Constructorul clasei de baz este apelat intotdeauna inaintea constructorului clasei derivate;
10. Pentru apel constructor al cl de baz cu argumente: super ( argumente)

Sintaxa compoziiei:
1. Se plaseaz o referin ctre un obiect nou ntr-o clas nou
2. Referintele nou create se initializeaz la valoarea null -> trebuie initializate explicit

Operatia de delegare:
1. Operatie intermediar intre compozitie si agregare
2. Intr-o clas se plaseaz un obiect membru din a 2-a clas, iar clasa nou va expune toate metodele
furnizate de obiectul din clasa 2-a
3. Pentru realizarea operatiilor de mostenire / compozitie, este suficient ca s se importe clasele
reutilizate (codul lor surs nu este necesar)

Mecanismul upcast:
1. Asocierea dintre numele metodei si corpul metodei legare (binding);
2. Early binding: atunci cand legarea se face la compilare;
3. Late binding: atunci cand legarea se face la executie, exact inainte de executia efectiva a metodei;
4. Late binding = dynamic binding sau runtime binding;
5. Late binding: necesit un mecanism pentru identificarea tipului la executie (RTTI) pentru a se
identifica in mod corect corpul metodei care trebuie apelat;
6. In Java se utilizeaza late binding pentru orice apel de metod, cu exceptia metodelor static si final
(private e implicit final pt ca o metoda private nu poate fi mostenita);
34

35

7. Campurile si elementele static sunt rezolvate la compilare;


8. Legarea constructorilor este realizata la compilare


Is-a vs. Is-like-a:
1. Relatie de mostenire de tip is-a: clasa derivat doar suprascrie interfaa clasei de baz;
2. Relatie de mostenire de tip is-like-a: clasa derivat contine metode suplimentare fa de clasa de baz;
3. Relaia de substituie: La o relatie de tip is-a substitutia este pur: orice mesaj trimis clasei derivate
poate fi trimis si clasei de baz (rezolvarea mesajului se face prin upcast) La o relaie de tip is-like-a:
partea extins din clasa derivat nu mai este disponibil prin upcast (prin adresarea clasei de baz);
4. Downcast: operaia invers upcast nu este o operaie garantat, in sensul in care nu stim exact clasa
derivat ctre care se face downcast;
5. Java verific orice conversie (cast), si daca nu se poate realiza se arunc o exceptie de tipul
ClassCastException

Containere:
1. Necesare datorita faptului ca nu stim de la design numarul de obiecte necesare pentru a rezolva o
anumita problema;
2. Containerele sunt siruri de referinte catre alte obiecte;
3. Ele se expandeaza automat pentru a salva noi obiecte, dupa necesitati;
4. 2 tipuri de liste: ArrayList, LinkedList;
5. Containerele in Java sunt create sa pastreze obiecte de tipul Object. -> ele pot salva orice;
6. Pot aparea exceptii la Downcast la runtime, timp de executie crescut datorit operaiei de Downcast

Cuvantul cheie this:
1. In fiecare metoda apelata, referinta obiectului sub care se apeleaza metoda este transmisa in metoda
sub forma referintei this
2. this poate fi utilizat doar in interiorul metodelor ne-statice
3. In interiorul unei metode dinstr-o clasa, la apelul unei metode din clasa curenta, nu este nevoie sa se
utilizeze this
4. This este frecvent utilizat in return, pentru a returna obiectul curent
35

36


Clase abstracte:
1. Dintr-o clasa abstracta nu se poate instantia nu se poate instantia si foloseste doar la dezvoltarea
ulterioara a unor clase ce descriu obiecte concrete;
2. Pot contine obiecte fara nici o implementare;
3. Este definita prin cuvantul cheie abstract;
4. Pune la dispozitia subclaselor un model complet pe care sa-l implementeze;
5. Nu se pot crea obiecte din clasa abstract = > eroare la compilare;
6. Are cel putin o metoda abstracta, care se implementeaza in toate subclasele.

Interfete:
1. Se implementeaza si metodele nu au bloc;
2. O clasa care implementeaza o interfata trebuie obligatoriu sa specifice implementari pentru toate
metodele interfetei;
3. O clasa poate implementa mai multe interfete = superinterfete separate prin virgula mostenire
multipla;
4. Corpul unei interfete contine variabile constante, implicit static si final care trebuie initializate;
5. Metodele sunt implicit public si nu pot fi declarate cu nici un identificator pblic, private sau protected;

Mosternirea multipla:
1. In Java se poate extinde o singura clas si se pot implementa oricate clase;
2. Rolul interfetelor: sa se poata face upcast la mai mult decat o clasa de baza
3. Daca se poate crea o clasa de baza fara definitii de metode si variabile membre, se recomanda sa se
creeze interfete in locul claselor abstracte; -Interfetele se pot combina (se extinde interfetele la fel ca si
clasele);
4. Coliziunea numelor la implementarea mai multor interfete (daca interfetele de baza au acelasi nume de
metoda cu semnaturi diferite): este o problema daca metodele difera doar prin tip de return => eroare
la compilare;
5. Campurile care sunt inserate intr-o interfata devin in mod automat statis si final => reprezinta un mod
convenabil pentru a defini constante (similar cu enum);
36

37

6. Campurile definite in interfete nu pot fi blank finals, ele trebuie initializate la definire.


Inner classes:
1. Se plaseaza clase in interiorul altor clase;
2. Inner classes reprezinta un concept diferit de compozitie;
3. De obicei, clasa exterioara are o metoda care returneaza un obiect din clasa inner;
4. Tipul obiectului din clasa interioara se specifica precum: OuterClass.InnerClass;
5. Obiectul clasei interioare are un link (referinta) catre obiectul clasei exterioare care l-a creat;
6. Obiectul clasei interioare poate accesa membrii obiectului clasei exterioare fara ca sa fie nevoie de
calificare (dreptul de a accesa este asupra tuturor obiectelor membre ale clasei exterioare;
7. Pentru a se obtine referinta la obiectul clasei exterioare (din obiectul clasei inner) se utilizeaza:
OuterType.this ;
8. Pentru a crea un obiect din clasa inner pornind de la un obiect din clasa outer se poate utiliza:
obiectOuter.new ;
9. Clasele inner sunt potrivite pentru a implementa interfete: se realizeaza ascunderea implementarii

Clase interioare anonime:
1. Sunt clase interioare fara nume (clase create direct la momentul utilizarii lor)
2. finalizeaza constructia instructiunii care contine definitia clasei anonime
3. Campurile din clasele anonime pot fi initializate cu valori din afara (din domeniul unde se creaza clasa)
4. Daca intr-o clasa anonima se doreste a fi utilizat un argument (sau o valoare) definita in afara acesteia,
atunci referinta acesteia trebuie sa fie final
5. Clasele anonime nu pot avea constructor, dar initializarile se pot realiza in blocul non-static de
initializare
6. Clasele interioare pot fi create static (nested classes) daca nu se doreste utilizarea referintei obiectului
exterior in interiorul clasei inner
7. Clasele interioare parte a unei interfete devin automat static public. Rol: crearea de cod comun care sa
fie utilizat de toate implementarile interfetei
8. Oricat de adanca este imbricarea claselor nested, acestea pot accesa obiectele membre din clasele
exterioare, indiferent de nivelul de imbricare
37

38

9. La mostenire dintr-o clasa inner, trebuie furnizat la constructia obiectului un obiect din clasa inner,
pentru a se permite construirea sub-obiectului cl. baza ( enclosingClassReference.super() )
10. Clasele locale unui domeniu de vizibilitate au access la toate variabilele domeniului respectiv (inclusiv
cele final), insa aceste clase nu au specificator de access


Closure:

un obiect apelabil care retine informatie despre domeniul de vizibilitate in care a fost creat (are access
la variabilele din domeniul de vizibilitate unde a fost creat); -=> clasa interioara este un closure
(deoarece are o referinta catre obiectul exterior si poate sa acceseze inclusiv membrii privati ai clasei
exterioare)

Callback:

un obiect primeste o informatie care va permite sa apelam obiectul initial la un moment ulterior de
timp. Se implementeaza cu clase interioare. Clasa de tip Closure furnizeaza o poat n intriorul clasei
exteriore (dar intr-un mod safe nu se necesit ca sa transformam accesul la metodele acestei clase)


Iteratori:
1. Este un design pattern;
2. Un obiect de tip iterator este asociat unei colectii si permite regasirea ordonata a obiectelor din colectia
respective;
3. Metoda iterator() a unei colectii;
4. Metoda next() a obiectului iterator: produce urmatorul element din colectie;
5. Metoda hasNext(): interogheaza daca mai sunt elemente neiterate;
6. Metoda remove(): sterge ultimul element iterat din colectie;
7. Iteratorii pot produce elementele colectiei doar intr-o singura directive;
8. ListIterator: furnizat doar de interfata List, poate parcurge elementele colectiei in ambele directii

Obiectul Class:
1. Java realizeaz RTTI prin intermediul obiectului Class;
2. Acesta contine informatie referitoare la tip, informatie care poate fi interogat;

38

39

3. Pentru fiecare clas pe care o avem in program, exist un obiect Class asociat; La compilarea unei noi
clase, acest obiect este creat si salvat in fisierul .class;
4. La crearea unui obiect dintr-o clas, JVM utilizeaz un subsistem numit class loader;
5. Toate clasele sunt incarcate in mod dinamic de ctre JVM la prima utilizare a acestora (anume cand se
face prima referinta la un membru static al clasei);
6. La incarcarea unei clase, se verific daca obiectul Class al tipului respectiv este incarcat, daca nu, se
identific fisierul .class pe disc, si octetii acestuia sunt verificati inainte s fie incarcati


Sistemul de I/O intr-un limbaj de programare:

Sistemul de I/O intr-un limbaj de programare trebuie s fie capabil s trateze:Surse diferite de
dispozitive de I/O (fisiere, consola, conexiuni de retea etc),Tipuri diferite de access la surse (access
secvential, access random, access buffered),Tipuri diferite de lucru cu sursa (binar, la nivel de caracter,
la nivel de linie, la nivel de cuvant)


Clasa File:
1. Reprezinta un nume a unui fisier sau unui set de fisiere dintr-un director;
2. Metoda list() -> produce un sir de String care reprezinta fisierele referite de obiectul de tip File;
3. List poate fi invocata utilizand un Directory Filter, pentru a returna doar acele fisiere pentru care numele
respecta un pattern;
4. Interfata FilenameFilter: metoda accept primeste la intrare obiectul de tip File si stringul pentru
comparare. Metoda list din File apeleaza metoda accept pentru fiecare fisier din File, iar acesta este
inserat in lista doar daca accept furnizeaza true;
5. Obiectul File poate fi utilizat ca sa creem/stergem/redenumim un director/fisier sau un director/fisier cu
o intreaga cale;
6. -File poate fi utilizat ca sa citim informatiile referitoare la un fisier/director

Input si Output:
1. Pentru intrare: clasele InputStream si Reader cu metoda read;
2. Pentru iesire: clasele OutputStream si Writer cu metoda write;
3. Read si write lucreaza pe octeti (sau siruri de octeti);
39

40

4. Toate clasele de I/O sunt derivate din acestea; -La realizarea efectiva de I/O programatorii creaza
insuruiri de obiecte din clasele de I/O (design patternul Decorator)



Tipuri de InputStream:
1. ByteArrayInputStream: permite ca un buffer de memorie sa fie utilizat ca si un InputStream (din buffer
se extrag octeti);
2. StringBufferInputStream: converteste un String intr-un InputStream;
3. FileInputStream: sursa de intrare e un fisier. Se furnizeaza la construirea obiectului fie un String fie un
File;
4. PipedInputStream: este asociat cu un PipedOutputStream (care este furnizat la construirea obiectului).
Implementeaza conceptul de Pipe;
5. SequenceInputStream: converteste unul sau mai multe InputStream intr-un singur obiect de tip
InputStream (la construire se furnizeaza fie un InputStream, fie un Enumerator de obiecte InputStream);
6. FilterInputStream: clasa abstracta, interfata pentru decoratorii care furnizeaza tipuri particulare de citire

Tipuri de OutputStream:
1. ByteArrayOutputStream: creaza un buffer de memorie (octeti). Datele scrise sunt trimise in acest buffer;
2. FileOutputStream: iesire intr-un fisier. Se construieste obiectul pe baza unui String sau a unui File;
3. PipedOutputStream: in conjunctie cu PipedInputStream. Pentru conceptul de Pipe;
4. FilterOutputStream: pentru iesire formatata, se implementeaza functionalitati de scriere


Reader si Writer:
1. Adauga functionalitate pentru I/O la nivel de caracter sau Unicode;
2. Clasele sunt adaugate in ierarhia InputStream si OutputStream deci nu se inlocuieste aceasta ierarhie;
3. Clase adapter: InputStreamReader si OutputStreamWriter;
4. Motivul pentru care au fost create: sa se permita internationalizarea (Unicode lucreaza cu caractere pe
16 biti);
5. Recomandare: sa se utilizeze clase de tip Reader si Writer ori de cate ori e posibil;
40

41

6. La citiri specifice la nivel de octet, sa se utilizeze InputStream si OutputStream


Serializare:
1. Pastrarea obiectelor dincolo de executia programelor;
2. Astfel obiectele pot fi recuperate si executia restartata de la punctul unde a fost oprita anterior;
3. Orice obiect dintr-o clas care implementeaza Serializable poate fi convertit in sir de octeti si apoi
restaurat;
4. Persistent: durata de viata a unui obiect exista dincolo de executia unui program;
5. Pentru realizarea persistentei, obiectele trebuie serializate / deserializate in mod explicit (lightweight
persistence);
6. Pentru serializare, se creaz un obiect dintr-un tip OutputStream, acesta este wrap in interiorul unui
ObjectOutputStream si se utilizeaza metoda writeObject;
7. Serializarea salveaza intreg webul de obiecte din spatele obiectului serializat; -Tipul unui obiect
deserializat: getClass


Externalize:
1. extinde interfata Serializable;
2. La obiectele deserializate cu Externalizable, obiectele sunt construite obisnuit (cu default constructor) si
apoi se apeleaza metoda readExternal;
3. La obiectele Externalizable, subobiectele componente trebuie serializate manual (in writeExternal) iar la
deserializare, ele trebuie recuperate de pe disc;
4. La mostenire dintr-o clasa Externalizable, se apeleaza writeExternal si readExternal a clasei de baza
pentru a se asigura serializare / deserializare corecta

RTTI:
1. Run-Time Type Identification
2. Descoperirea tipului la executie si utilizarea acestuia
3. 2 tipuri de RTTI:
-Traditional la compilare
41

42

-Reflection: - la executie !!!


4. Upcast: necesit realizarea automata a RTTI pentru invocarea automat (polimorfic) a metodei
suprascrise
5. Prin RTTI se poate identifica tipul exact al unui obiect la executie (limbajul de programare are metode
pentru a realiza acest lucru)


Final:
1. declara ca o clasa nu poate accesa subclase
2. declararea are 2 scopuri:

securitate : unele metode pot astepta ca parametru un obiect al unei clase si nu al unei sublcase, dar
tipul exact al unui obiect nu poate fi aflat cu exactitate decat in momentul executiei

programare in spirit orientat obiect: o clasa perfecta nu trebuie sa aiba subclase


Finalize:

Este o metoda ce se implementeaza in vederea oricarui tip ce incapsuleaza o resursa negestionata, care
trebuie sa suporte finalizarea, adica GC determina ca un obiect trebuie eliminate din memorie si
apeleaza metoda Finalize care ofera resursei eliberarea corecta, colectarea acesteia


Executia unui bloc Try-Catch-Finally:
1. Un bloc try este urmat de mai multe blocuri catch si optional de un bloc finally
2. Blocul try-catch sta la baza sistemului de tratare a erorilor, o portiune de cod nu poate fi
monitrizata pentru tratarea exceptiilor, fara a fi inclusa intr-un astfel de bloc
3. Daca o exceptie este aruncata in blocul try, aceasta este prinsa in blocul catch corespunzator,
dupa care blocul acelui catch se executa
4. Finally este folosit atunci cand dorim ca anumite portiuni de cod sa se execute indifferent daca
blocul try s-a executat normal sau a generat o exceptie => blocul finally se executa indifferent
de modul in care blocul try si-a terminat executia

42

43

Clauza throws:
1. Daca o metoda contine cod care ar putea genera o exceptie, si totusi, in cadrul metodei nu exista un
cod try-catch care sa prinda acea exceptie => metoda trebuie sa specifice prin clauza throws ca
poate genera acea exceptie
2. Nu se supun acestei reguli exceptiile care sunt subclase ale claselor Error si RunTimeException

Clauza throw:

Pentru a genera manual o exceptie in urma unei stari pe care o consideram eronata, folosim cuvantul
cheie throw;

Polimorfism:
1. Acelasi nume se poate referi la 2 metode diferite.
2. Este de 2 feluri:

Overriding metoda cu acceasi semnatura cu o alta din clasa parinte;

Overriding doua sau mai multe metode in acelasi clasa cu acelasi nume, dar semnaturi diferite.


Organizarea codului:
1. Pentru fiecare clasa compilata se produce un fisier .class
2. Un program este compus dintr-o colectie de fisiere .class
3. Acestea pot fi arhivate: fisier .jar
4. Fiecare fisier .java incepe cu mentiunea package: se indica numele packageului din care vor face parte
clasele
5. Clasele utilizate care fac parte din alt package se importa cu import
6. Toate clasele dintr-un package vor fi colectate intr-un singur subdirector
7. Conventie pentru denumirea packageurilor: utilizarea domeniilor de internet in ordine inversa
8. Calea root pentru directorare: variabila sistem CLASSPATH
9. CLASSPATH poate include directoare sau fisiere .jar

1. Design patternul Proxy

43

44

Este sablonul care permite crearea unui inlocuitor pentru un obiect, inlocuitor care sa controleze
accesul la obiectul respectiv. Acest sablon se mai numeste surogat.
Sablonul Proxy se aplica in general in situatiile in care este necesara o referinta la un obiect mai complexa si
mai flexibila decat un simplu pointer. Cateva dintre cazurile in care sablonul Proxy poate fi utilizat sunt:
necesitatea unui reprezentant local al unui obiect aflat in alt spatiu de adrese (pe alta masina) decat
clientul sau. In acest caz obiectul proxy care joaca rolul reprezentantului local se mai numeste remote proxy
sau ambasador;
crearea la comanda a obiectelor costisitoare (cum este cazul din exemplul prezentat in paragraful
anterior). In acest caz obiectul proxy se mai numeste proxy virtual, el dand iluzia existentei unui obiect server
inainte ca acesta sa fi fost creat;
daca se pune problema ca diversi clienti sa aibe drepturi de acces diferite la un anumit obiect server, se
poate folosi cate un obiect proxy care sa reprezinte serverul din perspectiva fiecarei categorii de clienti. In acest
caz, obiectul proxy se mai numeste proxy de protectie;
un obiect proxy poate juca rolul unui pointer inteligent, care poate efectua operatii suplimentare la
accesarea obiectului referit. Asemenea operatii suplimentare tipice sunt:
o

o
o

contorizarea referintelor la un anumit obiect, existente la un moment dat. Acest lucru


permite stergerea obiectului respectiv cand se constata ca nu mai exista nici o referinta
la el. De exemplu, un garbage collector ar putea utiliza acest principiu de lucru;
incarcarea in memorie a unui obiect persistent atunci cand el este referit prima oara;
asigurarea blocarii obiectului referit, pe durata accesarii lui, astfel incat sa nu poata fi
modificat

ablonul Proxy asigur un surogat sau un nlocuitor


pentru alt obiect pentru a controla accesul la acesta
l Delegarea la distan controleaz accesul ctre un obiect nelocal
l Delegarea virtual controleaz accesul la o resurs costisitor de creat
l Delegarea de protecie controleaz accesul la o resurs pe baza unor drepturi de acces
l Referin inteligent: copierea la scriere (copy on write), blocarea unui obiect, numrarea referinelor, caching

25.Design patternul Iterator

44

45

Sablonul Iterator asigura o cale de accesare secventiala a elementelor unui obiect agregat, fara a
expune reprezentarea lui de baza.
l Metodele Iteratorului pot avea nume diferite
l Java Iterator: next(), hasNext(), remove()
l C# IEnumerator: Current, MoveNext(), Reset()
l Exist Iteratori interni i externi
l Iteratorul extern este controlat de client, ca n exemplul precedent (cu metoda next)
l Iteratorul intern este controlat de Iteratorul nsui, cruia trebuie s i se spun ce operaii s efectueze cu
elementele pe care le parcurge
ablonul se utilizeaz pentru:
l A accesa coninutul unui obiect agregat fr a expune reprezentarea intern
l A asigura suport pentru mai multe traversri ale obiectelor agregate
l A furniza o interfa uniform pentru traversarea structurilor agregate diferite
l Pentru a suporta o iteraie polimorfic

Suport variaii n traversarea unui agregat
l Obiectele agregate pot fi traversate n mai multe feluri i de mai multe ori
l Obiectele Iterator simplific interfaa Agregat
l Agregatul are nevoie de o metod unic pentru crearea Iteratorului
l Scade cuplarea dintre client i obiectele agregate
l Crete coeziunea obiectului agregat prin eliminarea necesitii de a asigura el nsui traversarea

26. Design patternul Strategy
Scop: Se definete o familie de algoritmi; se ncapsuleaz fiecare mebru; algoritmii se fac
interschimbabili.
Aplicabilitate
Multe clase nrudite difer doar prin comportament
45

46

Se folosesc diverse variante ale unui algoritm


Algoritmii folosesc date irelevante pentru client
O clas definete comportamente multiple, definite de conditii gard la nceputul metodelor.
2. Ce este o clasa java si cum se salveaza pe disk?

Clas: set de obiecte cu caracteristici i funcionalitate identice (termenul de clasa se


substituite termenului de tip)
O clasa reprezinta o modalitate de a descrie un nou tip de date. Clasa este o descriere a unei
multimi de obiecte caracterizate prin structuri si comportamente similare. De aceea,
o clasa va cuprinde definitiile datelor si operatiilor ce caracterizeaza obiectele clasei
respective.
Datele definite intr-o clasa se mai numesc atribute, iar operatiile se mai
numesc metode sau functii-membru. Atributele si metodele formeaza membrii unei clase.
Sintaxa folosita pentru a defini o clasa in Java este:
class nume_clasa {
// date si metode
}
Salvarea pe disk se face in folderul built cu numele clasei si extensia .class
3. Ce este un package?
Un package grupeaza toate clasele , Utilizate pentru organizarea claselor . Packageurile pot si
comprimate sub forma jar.
4. Defineste final, finally finalize.
Final- o clasa declarata cu final nu poate fi subclasata. O clasa declarata ca final opreste linia de
mostenire, nu se poate extinde o clasa finala. O metoda declarata cu final nu poate fi
suprascrisa.O variabila declarata cu final poate fi initializata numai o singura data. Utilizata in
special pentru mostenire
Finally- Blocul declarat cu finally se executa mereu dupa try and catch atunci cand apare o
exceptie neasteptata sau fara a fi o exceptie.Este utilizat pentru a evita . Ajuta programatorul sa
evite curatarea codului accidentala prin return break sau continue.
46

47

Finalize-este o metoda care daca este prezenta intr-o clasa este apelata inaintea garbage
collectorului. Metoda finalize() este utilizata pentru curatarea codului inainte ca un obiesct sa fie
luat de garbage colector
5. Defineste variabila locala, variabila membra si variabila de clasa
Variabile de instan. Sunt unice fiecrei instane le clasei.
Variabile de clas. O singur copie pentru toate instanele clasei. Se folosete modificatorul de
acces static.
Variabile locale. Variabile temporare declarate n cadrul unei metode sau a unui bloc. Sunt
vizibile doar n cadrul acelei metode.
Parametri. Variabilele prin care se trimit argumente la apelul metodelor.
variabile de Instanta (atribute) aceste variabile definesc valorile unui obiect, deci, ele sunt
create atunci cnd obiectul este creat; ele exista de cnd obiectul este creat si pana cand acesta
este distrus; doar obiectul si metodele sale au acces la variabilele de instanta;
variabilele statice aceste variabile sunt parte dintr-o clasa; sunt create atunci cnd clasa este
incarcata de JVM;
variabile locale ale unor metode aceste variabile sunt definite pe stiva metodei si ele exista
atta timp ct metoda este executata (exista in stiva de apeluri); variabilele locale nu pot fi
accesate si din interiorul unor metode imbricate chiar daca ele exista cand metoda imbricata este
executata
variabile locale unui bloc de cod - aceste variabile sunt definite in interiorul blocurilor de cod
(intre { si }) si poate fi utilizate in timp ce blocul este executat; blocuri de cod sunt tipice pentru,
for, while si blocuri de initializare.
Variablie membre- sunt declarate in cadrul unei clase, dar apartin unui obiect.

6. Defineste private, protected , public


Private: elementele private pot fi accesate doar de creatorul clasei in cadrul metodelor acelei
clase
47

48

- folosit in declararea unui camp sau a unei metode dintr-o clasa - specifica faptul ca membrul
sau metoda respectiva poate fi accesata doar din cadrul clasei insesi, nu si din clasele derivate
din aceasta clasa.
Public: elementele publice sunt disponibile oricaror alte clase
Protected: similar cu private, utilizat in mostenire, clasele care mostenesc pot accesa elementele
private din clasele de baza
-folosit in declararea unui camp sau a unei metode dintr-o clasa - specifica faptul ca membrul
sau metoda respectiva poate fi accesata doar din cadrul clasei insesi sau din clasele derivate din
aceasta clasa.

7. Rolul claselor de tip Filter


Un filtru este un obiect de a efectua sarcini de filtrare pe fiecare cerere, la o resurs (cu un
coninut de servlet sau statice), sau pe rspunsul la o resurs, sau ambele.
Exemplele care au fost identificate pentru acest design sunt
1) Filtre de autentificare
2) exploatarea forestier i Audit filtre
3) de conversie fotografie filtre
4) Filtre de compresie a datelor
5) Filtrele de criptare
6) Filtre Tokenizing
7) Filtre care declanseaza resurse de acces evenimente
8) XSL / T filtre
9) Mime-Tip filtru lan
Clasele Filter sunt radacina abstracta a claselor de decorator
8. Descrieti modul de utilizare a Decoratorilor la realizarea i/o in java
Biblioteca Java I/O are o structura stratificata care permite sporirea "responsabilitatilor" unor obiecte individuale intrun mod dinamic si transparent. De exemplu, am putea dori saimbogatim un input stream de baza, care opereaza doar la
nivel de octet sau sir de octeti, cu posibilitatea de a citi tipuri primitive: input stream-ul nostru ar putea citi 4 octeti deodata,
pe care sa-i intoarca sub forma unui int.

48

49

Acest mod de a crea o structura de clase este cunoscuta sub numele de Decorator Pattern. Acest pattern impune ca
obiectele care adauga functionalitate (wrappers) unui obiect anume sa aibe aceeasi interfata. Astfel, folosirea
decoratorilor poate fi transparenta, in sensul ca putem folosi un obiect in aceeasi maniera, indiferent daca a fost decorat
sau nu. Clasele filtru, de baza (ca FilterInputStream), sunt punctul de plecare pentru clasele decorator din Java I/O.
In concluzie, clasele de baza in ierarhia I/O octet devin:

InputStream, OutputStream: pentru definirea de stream-uri de baza, corespunzatoare unor entitati I/O

FilterInputStream, FilterOutputStream: pentru definirea de stream-uri decorator, care isi vor baza
intotdeauna functionalitatea pe un alt stream (underlying), care, la randul sau, poate fi decorat sau nu.

Un exemplu de decorator, foarte des intalnit, este al claselor DataInputStream/DataOutputStream, care permit
citirea de tipuri primitive din alte fluxuri octet, oferind metode ca readByte,readInt, readFloat, readBoolean, si
omoloagele lor, writeByte, writeInt etc.

9. Care este diferenta intre o clasa abstracta si o interfata


O interfata defineste un set de metode, proprietati, evenimente, indexatori. Acesti membri vor
fi implementati de o clasa sau chiar de o structura.
O clasa abstracta este o clasa care nu poate fi instantiata si este folosita pentru mostenire.
O clasa care nu este abstracta si care deriveaza dintr-o clasa abstracta, trebuie sa includa
implementarile tuturor membrilor abstracti.

10. Descrieti mecanismul try-catch-finally


try {
// codul care este susceptibil sa genereze exceptie
} catch (Type1 tp1) {
// exceptii de tipul Type1
} catch (Type2 tp2) {
// exceptii de tipul Type2
}
finally {
// cod care se executa indiferent de tipul de exceptie aruncat (sau nu)
}
49

50

Try catch functioneaza ca un switch pe tipul de exceptie


2 modalitati de tratare a erorilor
n Termination: eroarea este aruncata
n Resumption: se insereaza cod try catch pt rezolvarea erorii
Blocul "try" contine instructiunile de deschidere a unui fisier si de citire dintr-un fisier ambele
putnd produce exceptii. Exceptiile provocate de aceste instructiuni sunt tratate n cele doua
blocuri "catch", cte unul pentru fiecare tip de exceptie.
Inchiderea fisierului se face n blocul "finally", deoarece acesta este sigur ca se va executa. Fara
a folosi blocul "finally" nchiderea fisierului ar fi trebuit facuta n fiecare situatie n care fisierul
ar fi fost deschis, ceea ce ar fi dus la scrierea de cod redundant:
11. Descrieti modulele de creare a obiectelor din tipul claselor interioare care nu sunt
anonimie
Clasa interioar este necesar numai clasei exterioare. Pentru reducerea numrului de clase de
nivel superior si pentru simplificarea comunicrii ntre clasele asculttor la evenimente putem
defini clasele receptor ca niste clase interioare cu nume, incluse n clasa cu fereastra aplicatiei:
class MFrame extends JFrame {
JButton b1 = new JButton (" + ");
JButton b2 = new JButton (" - ");
JTextField text = new JTextField (6);
int n= 0;
public MFrame() {
Container c = getContentPane();
b1.addActionListener (new B1L());
b2.addActionListener (new B2L());
c.setLayout (new FlowLayout());
c.add(b1); c.add(b2);
text.setText(" "+n);
c.add (text);
}
// clase incluse cu nume
class B1L implements ActionListener {
public void actionPerformed (ActionEvent ev) {
text.setText(" "+ ++n);
50

51

}
}
class B2L implements ActionListener {
public void actionPerformed (ActionEvent ev) {
text.setText(" "+ --n);
}
}
Definirea de clase incluse anonime reduce si mai mult lungimea programelor, dar
ele sunt mai greu de citit si de extins
12. Descrieti modaliatea de realizare a unui iterator si incercati sa furnizati un exemplu
concret de utilizare a acestui sablon de programare
Un iterator este un obiect care permite traversarea unei colectii si modificarea
acesteia (ex: stergere de elemente) in mod selectiv. Puteti obtine un iterator pentru o
colectie, apeland metoda sa iterator(). Interfata Iterator este urmatoarea:
public interface Iterator<E> {
boolean hasNext();
E next();
void remove(); // optional
}
Metodele au urmatorul comportament:
hasNext -intoarce true daca mai exista elemente neparcurse inca de iteratorul respectiv
next -intoarce urmatorul element
remove -elimina din colectie ultimul element intors de next. In mod evident, remove nu
poate fi apelat decat o singura data dupa un apel next. Daca aceasta regula nu este
respectata, vom primi o eroare.
Ne putem imagina ca un iterator se pozitioneaza intre elementele colectiei. Initial, cursorul
sau precede primul element, astfel ca primul apel next va intoarce primul element.
Atentie: Metoda remove este singura modalitate SIGURA de a inlatura un element dintr-o
colectie in timpul parcurgerii acesteia. Orice alta metoda are un comportament neprecizat
(nu putem garanta ca stergerea va avea loc, sau ca elementul sters va fi cel pe care chiar
doream sa-l stergem).
Este util sa folosim iteratori cand dorim: stergerea elementului curent, in timpul iterarii
Cand dorim sa iteram mai multe colectii in paralel.

51

52

Exemplu de folosire a unui iterator:


Collection c = new ArrayList();
Iterator it = c.iterator();
while (it.hasNext()) {
//verificari asupra elementului curent: it.next();
it.remove();
}
13. Ce inseamna upcast? Descrieti mecanismul legarii intarziate si cum faciliteaza acest
mecanism realizarea proprietatii de upcast.
Proprietatea de upcast presupune tratarea unui obiect dintr-o clasa derivata ca si
cum ar fi din clasa de baz.
Legare (binding) = asocierea dintre numele metodei si corpul metodei. Late binding
necesita un mecanism pt identificarea tipului la executie(RTTI), pt a se identifica in mod
corect corpul metodei care trebuie apelat. In cazul late binding, legarea se face la executie,
exact inainte de executia efectiva a metodei. Se utilizeaza late binding pt orice apel de
metoda, cu exceptia metodelor static si final.
14. Care este rolul constructorului de copiere in cazul agregarii indirecte?
Constructorul este o metod special apelat automat la instanierea unei clase i face
operaiile necesare pentru iniializarea fiecrui obiect al unei clase fie ea static sau
dinamic. Dac se folosete pentru a iniializa un obiect cu alt obiect atunci denumirea de
constructor de copiere.
Agregarea este relatia intre doua obiecte in care unul dintre obiecte apartine celuilalt
obiect. Agregarea reda apartenta unui obiect la un alt obiect.
Din punct de vedere conceptual, exista 2 tipuri de agregare:
strong la disparitia obiectelor continute prin agregare, existenta obiectului container
inceteaza (de exemplu, o carte nu poate exista fara pagini)
weak obiectul-container poate exista si in absenta obiectelor agregate (de exemplu, o
biblioteca poate exista si fara carti)
agregare indirect ?
15. Care este diferenta intre colectiile generice, heterogene si parametrizate?
Colectiile sunt un ansamblu de iterfete si clase ce realizeaza: colectarea impreuna a
obiectelor, stocarea, sortarea si accesarea obiectelor.
Colectii generice putem specifica tipul de data pe care il va folosi colectia,
ex: List<String> strings
52

53

Colectii eterogene atunci cnd se creaz o colecie pentru elemente de acelai tip
(necunoscut), oricine poate insera elemente de alt tip
Colectii parametrizate 16. Serializarea
Pastrarea obiectelor dincolo de executia programului.
= transformarea unui obiect intr-o secventa de octeti, din care sa poata fi refacut ulterior
obiectul original. Este un mechanism utilizat pt salvarea si restaurarea datelor.
17. Externalizarea
Ce se intampla daca dorim ca parti din obiect sa nu fie serializate?
Sau dorim s recreem subobiecte de la zero?
Interfata Externalizable: extinde interfata Serializable
2 metode noi: writeExternal, readExternal
Aceste metode sunt apelate automat la serializare / deserializare si contin cod suplimentar
care se executa la aceste operatii
La obiectele deserializate cu Externalizable, obiectele sunt construite obisnuit (cu default
constructor) si apoi se apeleaza metoda readExternal
La obiectele Externalizable, subobiectele componente trebuie serializate manual (in
writeExternal) iar la deserializare, ele trebuie recuperate de pe disc
La mostenire dintr-o clasa Externalizable, se apeleaza writeExternal si readExternal a
clasei de baza pentru a se asigura serializare / deserializare corecta
Evitarea serializarii anumitor componente ale obiectelor
Prima metoda: utilizarea Externalizable
Metoda 2-a: cuvantul cheie transient: indica faptul acel camp marcat cu transient nu va fi
serializat ca si parte a procesului automat de serializare
Metoda 3-a: se adauga la clase metodele writeObject si readObject in care se furnizeaza
codul programatorului pentru serializare
Aceste metode sunt private si sunt apelate automat de catre writeObject si readObject a claselor
ObjectOutputStream si ObjectInputStream

53

54

18. Suprancrcarea
Suprancrcarea unei metode (owerloading) este procesul prin care n cadrul unei clase sunt
adugate dou sau mai multe metode cu acelai nume dar cu numr diferit de parametri. n
momentul apelrii metodei, mediul de rulare va ti exact ce metod s apeleze pe baza
parametrilor specificai astfel nct nu exista posibilitate de confuzie si de apelare a unei
metode greite.
19. Cuvntul cheie this
Cuvntul cheie this este folosit n cadrul metodelor atunci cnd se dorete s se aib acces la
referina obiectului curent. Cuvntul cheie this este o referin ctre obiectul curent. Acest
cuvnt cheie este folosit doar n cazurile speciale cnd este nevoie s se fac o referin
explicit la obiectul curent. De exemplu n cazul unei metode care trebuie
s returneze obiectul curent.
20. Cuvntul cheie static
Cuvntul cheie static este folosit n java pentru a defini o variabil sau o metod care poate fi
accesata prin intermediul numelui clasei, fr a fi nevoie s se construiasc obiecte de tipul
respectiv. n construirea unei aplicaii orientate pe obiecte utilizarea atributelor sau metodelor
statice trebuie s fie evitat i acestea s fie folosite doar n cazuri de strict necesitate.
21. Clase i metode abstracte

o metod se numete abstract dac este doar declarat i nu definit. Declaraia va


conine, obligatoriu, cuvntul cheie abstract: abstract numemetoda ();

o clas ce conine mcar o metod abstract devine clas abstract i va trebui calificat
ca atare (n caz contrar se produce o eroare de compilare). Fiind o clas incomplet, tentativa
de a crea un obiect de tip abstract, se soldeaz cu eroare.

22. Interfaa
Interfaa acoper noiunea de clas abstract pur. n aceast situaie definiia tipului este
precedat de cuvntul cheie interface, ce va nlocui cuvntul cheie class.
Prin interfa se pune la dispoziie o form i nu o implementare. Ea poate conine:

membri de tip primitiv (implicit statici i finali);

nume de metode crora li se ataeaz:


- lista de argumente de apel;
- tipurile returnate

54

55

23. Design patternul Proxy


Este sablonul care permite crearea unui inlocuitor pentru un obiect, inlocuitor care sa
controleze accesul la obiectul respectiv. Acest sablon se mai numeste surogat.
Sablonul Proxy se aplica in general in situatiile in care este necesara o referinta la un obiect mai
complexa si mai flexibila decat un simplu pointer. Cateva dintre cazurile in care sablonul Proxy
poate fi utilizat sunt:
necesitatea unui reprezentant local al unui obiect aflat in alt spatiu de adrese (pe alta masina)
decat clientul sau. In acest caz obiectul proxy care joaca rolul reprezentantului local se mai numeste
remote proxy sau ambasador;
crearea la comanda a obiectelor costisitoare (cum este cazul din exemplul prezentat in
paragraful anterior). In acest caz obiectul proxy se mai numeste proxy virtual, el dand iluzia
existentei unui obiect server inainte ca acesta sa fi fost creat;
daca se pune problema ca diversi clienti sa aibe drepturi de acces diferite la un anumit obiect
server, se poate folosi cate un obiect proxy care sa reprezinte serverul din perspectiva fiecarei
categorii de clienti. In acest caz, obiectul proxy se mai numeste proxy de protectie;
un obiect proxy poate juca rolul unui pointer inteligent, care poate efectua operatii suplimentare
la accesarea obiectului referit. Asemenea operatii suplimentare tipice sunt:
o

o
o

contorizarea referintelor la un anumit obiect, existente la un moment dat. Acest


lucru permite stergerea obiectului respectiv cand se constata ca nu mai exista
nici o referinta la el. De exemplu, un garbage collector ar putea utiliza acest
principiu de lucru;
incarcarea in memorie a unui obiect persistent atunci cand el este referit prima
oara;
asigurarea blocarii obiectului referit, pe durata accesarii lui, astfel incat sa nu
poata fi modificat

ablonul Proxy asigur un surogat sau un nlocuitor


pentru alt obiect pentru a controla accesul la acesta
l Delegarea la distan controleaz accesul ctre un obiect nelocal
l Delegarea virtual controleaz accesul la o resurs costisitor de creat
l Delegarea de protecie controleaz accesul la o resurs pe baza unor drepturi de acces
55

56

l Referin inteligent: copierea la scriere (copy on write), blocarea unui obiect, numrarea
referinelor, caching
25.Design patternul Iterator
Sablonul Iterator asigura o cale de accesare secventiala a elementelor unui obiect agregat, fara
a expune reprezentarea lui de baza.
l Metodele Iteratorului pot avea nume diferite
l Java Iterator: next(), hasNext(), remove()
l C# IEnumerator: Current, MoveNext(), Reset()
l Exist Iteratori interni i externi
l Iteratorul extern este controlat de client, ca n exemplul precedent (cu metoda next)
l Iteratorul intern este controlat de Iteratorul nsui, cruia trebuie s i se spun ce operaii s
efectueze cu elementele pe care le parcurge
ablonul se utilizeaz pentru:
l A accesa coninutul unui obiect agregat fr a expune reprezentarea intern
l A asigura suport pentru mai multe traversri ale obiectelor agregate
l A furniza o interfa uniform pentru traversarea structurilor agregate diferite
l Pentru a suporta o iteraie polimorfic
Suport variaii n traversarea unui agregat
l Obiectele agregate pot fi traversate n mai multe feluri i de mai multe ori
l Obiectele Iterator simplific interfaa Agregat
l Agregatul are nevoie de o metod unic pentru crearea Iteratorului
l Scade cuplarea dintre client i obiectele agregate

56

57

l Crete coeziunea obiectului agregat prin eliminarea necesitii de a asigura el nsui traversarea

26. Design patternul Strategy


Scop: Se definete o familie de algoritmi; se ncapsuleaz fiecare mebru; algoritmii se fac
interschimbabili.
Aplicabilitate
Multe clase nrudite difer doar prin comportament
Se folosesc diverse variante ale unui algoritm
Algoritmii folosesc date irelevante pentru client
O clas definete comportamente multiple, definite de conditii gard la nceputul metodelor.

57