Documente Academic
Documente Profesional
Documente Cultură
Cuprins
Principiile programarii obiectuale
Notiunea de obiect
Cluj-Napoca - 30 septembrie
2015
Programare obiectual:
Elemente din spaiul problemei precum si reprezentarile
acestora in spatiul solutiei obiecte
Nume de 4p ->
Light
on()
o()
brighten()
dim()
Interfata ->
Light lt = new Light();
lt.on();
Cluj-Napoca - 30 septembrie
2015
Ascunderea implementarii
2 tipuri de programatori:
creatori de clase creaza clase care expun doar functionalitatea necesara
claselor client, restul ramane ascuns
programatori client consumatori de clase, rolul lor este sa fie echipati cu un set
de clase pentru dezvoltarea rapida a aplicatiilor finale
Cluj-Napoca - 30 septembrie
2015
Cluj-Napoca - 30 septembrie
2015
toti membrii clasei de baza (inclusiv cei privati care sunt ascunsi)
Toata interfata clasei de baza, care este duplicata
Cluj-Napoca - 30 septembrie
2015
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)
Cluj-Napoca - 30 septembrie
2015
baza
AsDel, putem scrie cod care nu depinde de un 4p specic si care
manipuleaza obiecte generice
Se doreste ca s se execute codul din obiectele claselor derivate fr
ca s s4m (la compilare) care vor efec4v aceste obiecte
Cluj-Napoca - 30 septembrie
2015
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
Containere parametrizate:
ArrayList<Shape> shape = new ArrayList<Shape>();
Cluj-Napoca - 30 septembrie
2015
Organizarea codului
De ex:
String s; // se creaza o referinta catre un obiect de tip String
String s = new String(asdf); // referinta creata este initializata
Tipurile primitive
v
v
v
v
BigInteger si BigDecimal
Sunt vazute ca si clase de tip Wrapper insa nu au un tip primitiv
corespondent
Clase
class ATypeName { /* class body */}
Clasele contin:
- Campuri
- Metode
Vizibilitatea numelor
ex: ro.ubbcluj.econ.gsilaghi
Operatori
Controlul executiei
if-then-else
while, do-while, for
foreach: pentru a selecta un element dintr-un array si a efectua o
prelucrare pe acel element
foreach functioneaza pentru orice sir de obiecte Iterable
Initializarea obiectelor
" In ecare clasa se garanteaza ini4alizarea obiectelor prin scrierea unui
"
"
"
"
"
constructor
La crearea unui obiect, Java apeleaza automat constructorul clasei
respec4ve
Numele constructorului este iden4c cu numele clasei
Constructorul default: nu are argumente
Constructorul nu are 4p de return
Daca se creaza o clasa fr nici un constructor, compilatorul creaz in
mod automat constructorul default
Supraincarcarea metodelor
"
"
"
"
Distrugerea obiectelor
Blocul static
Initializarea sirurilor
Public:
membrii publici pot fi referiti din afara claselor
Specific interfaa claselor
Private:
Pot fi referiti doar din interiorul claselor de definire
Specifica implementarea claselor
Reu4lizarea claselor
Cuprins
Compozitie
Mostenire
Alegerea intre compozitie si mostenire
Mecanismul de upcast
Reutilizarea codului
Sintaxa mostenirii
Operatia de delegare
final
Mecanismul upcast
Downcast
Interfete
Cuprins
Clase abstracte
Interfete
Design patternul Strategy si Adapter
Design parternul Factory
Clase abstracte
Conceptul de Interfa
Mosternirea multipla
Clase interioare
Inner classes
Sunt clase interioare fara nume (clase create direct la momentul utilizarii
lor)
; finalizeaza constructia instructiunii care contine definitia clasei anonime
Campurile din clasele anonime pot fi initializate cu valori din afara (din
domeniul unde se creaza clasa)
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
Clasele anonime nu pot avea constructor, dar initializarile se pot realiza in
blocul non-static de initializare
Clasele interioare pot fi create static (nested classes) daca nu se doreste
utilizarea referintei obiectului exterior in interiorul clasei inner
Clasele interioare parte a unei interfete devin automat static public. Rol:
crearea de cod comun care sa fie utilizat de toate implementarile interfetei
Oricat de adanca este imbricarea claselor nested, acestea pot accesa
obiectele membre din clasele exterioare, indiferent de nivelul de imbricare
Cluj-Napoca - 21 Octombrie 2015
De ce clase inner?
Control frameworks
Colec4i, Excep4i
Introducere
Sirurile de obiecte (arrays): reprezinta cel mai eficient mod pentru
a pstra obiecte.
Neajuns: au dimensiunea fixata la compilare
Java.util: clase container: List, Set, Queue, Map
Pre-java SE5: containerele java pot memora orice tip de obiecte,
deci pot aprea erori
De exemplu: ArrayList are metodele add si get definire utilizand
clasa Object
Erorile la regasirea obiectelor din container pot sa fie identificate
doar la executie (ClassCastException)
Containere generice
TipContainer<TipDeBaza>
In container se pot pstra doar obiecte din tipul de baz
Se obtine o eroare la compilare daca se incearc stocarea unui
obiect dintr-un alt tip
Nu mai este necesar operatia de cast (conversie) la regasirea
obiectelor
1.
2.
3.
Lucrul cu containerele
Tiparirea acestora: metoda toString
sortare: metoda sort
Iteratori
Exceptii (i)
Exceptii (ii)
if (t==null)
throw new NullPointerException();
Guarded regions
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)
}
Specificarea exceptiei
La o metoda, prin throws se indica tipul erorilor care pot sa fie aruncate de
ctre metoda respectiva
Erorile de tip RuntimeException nu trebuiesc specificate prin throws
Compilatorul forteaza programatorul s specifice exceptiile
Daca intr-o functie este posibil s apara o exceptie si programatorul nu o
specifica prin throws, atunci apare eroare la compilare
Erorile verificate si enforced la compilare: checked exceptions
StackTrace:
printStackTrace, getStackTrace
Inlantuirea exceptiilor
Exceptii pierdute
Restrictii la exceptii:
Guidelines
I/O in Java
Clasa File
Input si Output
Tipuri de InputStream
Tipuri de OutputStream
Tipuri de FilterInputStream
Tipuri de FilterOutputStream
Reader si Writer
Corespondenta de clase
Clase de (p InputStream /
OutputStream
InputStream
OutputStream
FileInputStream / FileOutputStream
FileReader / FileWriter
StringBueredInputStream
StringReader / StringWriter
ByteArrayInputStream /
ByteArrayOutputStream
CharArrayReader / CharArrayWriter
PipedInputStream / PipedOutputStream
PipedReader / PipedWriter
FilterInputStream / FilterOutputStream
FilterReader / FilterWriter
BueredInputStream /
BueredOutputStream
BueredReader / BueredWriter
PrintStream
PrintWriter
StreamTokenizer
PushbackInputStream
Cluj-Napoca - 28 Octombrie
2015
PushbackReader
RandomAccessFile
Fisiere jar
JAR: Java ARchive: colecteza fisiere intr-o singura arhiva pentru pentru
a putea fi transmise in Internet
Fisierul JAR contine fisierele arhivate + fisier manifest
JDK contine utilitarul jar pentru crearea de arhive jar
De obicei un fisier jar contine bytecode (fisiere .class)
serializare
Externalize
RTTI
RTTI
Obiectul Class
Obiectul Class
class literal
if (x instanceof Dog)
((Dog)x).bark();
Reflection
Tendinta curenta: numar mai mare de core-uri, in conditiile plafonarii vitezei chipurilor
Prin distribuirea takurilor pe procesoare se creste throughput
Chiar in conditiile single core, programele concurente se pot executa mai rapid
(datorita situatiilor blocking)
Daca un task (sau thread) nu poate continua (de ex. datorita operatiilor de I/O), se
spune ca acel task e blocat.
event-driven programming: realizarea de interfete grafice responsive, in conditiile in
care prelucrarile asociate unor evenimente dureaza
Un proces este un program de sine statator cu propriul spatiu de adrese
Un sistem de operare multi-tasking poate sa ruleze mai multe procese la un moment
dat (datorita schimbarii periodice a CPU de la un proces la altul) implementarea
concurentei la nivel de SO
Implementarea concurentei la nivel de mediu de programare: presupune existenta
unor resurse comune si coordonarea utilizarii acestor resurse de catre threaduri. Mai
mult, procesele pot comunica intre ele
Shared-memory
Distributed-memory
Cluj-Napoca - 4 Noiembrie 2015
Code design
Unele probleme (precum cele de simulare) sunt concurente prin definitia lor
Chiar daca sistemul pe care programul se executa are un singur CPU, programele
concurente au o claritate mai mare
Java threading este preemtiv => suport pentru numar limitat de threaduri (de
ordinul zecilor) -> poate fi limitativ in anumite situatii
Cooperative multithreading: nu exista o limita a taskurilor independente care pot
rula la un moment dat
Threading in Java
Fct main are alocat propriul thread. Pt un task nou, trebuie sa se creeze un
obiect dintr-o clasa care implementeaza Runnable
Terminologie
In Java exista distinctie intre taskul care este executat si threadul care
executa acest task
Obiectele care implementeaza Runnable sunt taskuri, iar threadurile ajuta la
executia acestor taskuri
Crearea unui thread este o operatie costisitoare (bazata low-level pe
conceptul de pthread din C) -> are sens ca sa gestionam threadurile cu
grija
-> distinctia task thread are sens
Terminologie:
Clasa Thread
Pentru a crea un thread, trebuie furnizat un obiect de tip Runnable
in constructorul unui obiect de tip Thread
Executors
Tipuri de ExecutorService:
FixedThreadPool: fixeaza de la inceput numarul de threaduri utilizate pentru
executia taskurilor. Este o metoda deosebit de eficienta pt ca overheadul cu
crearea threadurilor este realizat la crearea obiectului de tip ExecutorService
CachedThreadPool: permite un numar variabil de threaduri. Va opri crearea de
threaduri noi pe masura ce threadurile vechi sunt reciclate
SingleThreadExecutor este un FixedThreadPool cu un singur thread (de
obicei pentru long-lived thread ex. Treaduri care asculta un socket)
Cluj-Napoca - 4 Noiembrie 2015
Threaduri daemon
Prinderea exceptiilor
Daca apare o exceptie in metoda run, aceasta se va propaga pana la consola, in cazul
in care exceptia nu e rezolvata in run
Problema e rezolvata cu Executors
Exceptiile aruncate de metoda run nu pot fi prinse cu try-catch in jurul comenzii exec
a executorului
Prinderea unei exceptii aruncate de metoda run a unui thread
Se implementeaza interfata Thread.UncaughtExceptionHandler, creandu-se o clasa handler
de exceptie
Pentru threadul care ruleaza taskul, se asigneaza handlerul de exceptie cu metoda
setUncaughtExceptionHandler
Aceasta operatie poate fi scrisa in medoa newThread a unui ThreadFactory, si apoi se pot
utiliza executorii
Se poate asigna handlerul de exceptii implicit a clasei Thread cu
setDefaultUncaughtException
sectiuni critice : zonele de cod unde poate sa apara coliziunea intre threaduri
Atomicitate si volatilitate
Sectiuni critice
Avem nevoie de sectiuni critice daca partea critica este o bucata de cod dintr-o
metoda (spre deosebire de intreaga metoda)
Sectiunea critica poate sa fie marcata de cuvantul cheie synchronized(obiect)
Monitorul se achizitioneaza pt obiectul specificat
Daca se sincronizeaza doar pe sectiuni critice (si nu pe toata metoda) se poate
castiga timp pretios la executia programului
Pt sectiuni critice se pot folosi si obiecte de tip Lock
La sincronizare pe sectiuni critice, trebuie sa se utilizeze acelasi obiect ca si tinta a
sincronizarii
New: starea unui thread e new imediat dupa ce aceasta a fost creat. Threadul devine
eligibil s fie alocat ctre CPU spre executie
Runnable: threadul poate s fie rulat. Schedulerul nu este impiedicat de nimic ca sa
puna threadul in executie
Blocked: taskul poate si fie executat, dar exista ceva ce previne aceasta
Dead: un thread dead sau terminat nu mai poate fi alocat de ctre scheduler
Intreruperea taskurilor
Wait() permite sa se astepte realizarea unor conditii care sunt in afara controlului
taskului curent
Wait() suspenda taskul pana cand apare un notify sau un notifyAll
Wait e diferit de sleep si yield - acestea nu elibereaza lock-ul obiectului
Wait() suspenda executia threadului si elibereaza lock-ul obiectului
wait() poate avea ca si argument un numar de milisecunde
Wait(), notify() si notifyAll() sunt metode ale Object, ele pot fi apelate doar din
metode synchornized (ele elibereaza lock-ul)
Wait() apelat dintr-o metoda ne-synchronized genereaza IllegalMonitorStateException
Wait este inglobat intr-un while:
Mai multe taskuri pot sa astepte dupa acelasi lock pentru acelasi motiv
Pana ca taskul sa ajunga la wait() e posibil ca alt task sa schimbe situatia si taskul sa
trebuiasca resuspendat prin wait()
Este posibil ca taskuri diferite sa ceara acelasi lock pentru motive diferite
Semnale pierdute
Poate aparea semnal notify pierdut
T1:
synchronized(sharedMonitor) {
<setup condition for T2>
sharedMonitor.notify();
}
T2:
while(someCondition) {
// Point 1
synchronized(sharedMonitor) {
sharedMonitor.wait();
}
}
Corect:
T1:
synchronized(sharedMonitor) {
<setup condition for T2>
sharedMonitor.notify();
}
T2:
synchronized(sharedMonitor) {
while(someCondition) {
sharedMonitor.wait();
}
}
Deadlock
Apare atunci cand taskurile asteapta utilizarea unei resurse unul dupa
celalalt
Problema filosofilor (Dijkstra):
Filosofii desfasoara urmatoarele activitati: mananca si gandesc
Pentru a manca, ei pot utiliza un numar egal de furculite, ex. 5 filosofi
utilizeaza exact 5 furculite
Pentru a putea manca, fiecare filosof trebuie sa achizitioneze 2 furculite,
apoi executa operatia a manca, apoi elibereaza furculitele utilizate
Deadlock (II)
Apare atunci cand urmatoarele 4 conditii sunt simultan indeplinite:
Excluderea mutuala: cel putin una din resursele folosite de catre taskuri nu pot fi
utilizate in comun
Cel putin un task detine o astfel de resursa si asteapta sa achitioneze o alta
asemenea resursa detinuta de alt task
O astfel de resursa nu poate fi luata in mod fortat de la un task
Poate aparea un wait circular