Cuprins C u r s 1 . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . . . 6 Principii de baz a in obiectualitate .......... ........... ........... ....... 6 C l a s a : . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. . . . . . . . 6 . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. . . 6 I n t e r f a ț a : . . . . . . . . . . . . .. I m p l e m e n t ar a r e a : . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . 6 A s c u n d e r ea e a i m p l e m en e n t a r i i : . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . 7 SPECIFICATORII DE ACCES: .......... ........... ........... ........... .7 P r i v a t e : . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. . . . . . 7 P u b l i c : . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. . . . . . . . 7 P r o t e c t e d: d : . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. . . 7 R E U T I L I Z A R E A I M P L E M E N T A R I I – C O M P O Z I T I E . . . . . . . . . . . . . . 7 -
C o m p oz o z i t i e : . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . . . 7
R E U T I L I Z A R E A I M P L E M E N T A R I I – M O S T E N I R E . . . . . . . . . . . . . . . . . 8 M o s t e n i r e: e : . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. 8 OBIECTE INTERSCHIMBABILE PRIN POLIMORFISM .......... 8 IERARHIE CU O SINGURA RADACINA .................. ........... .9 C O N T A IN I N E R E . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . . . 9 C U R S 2 - 3 . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. . . . . . 1 0 ORGANIZAREA CODULUI ................... ........... ........... ..... 10 CREAREA OBIECTELOR SI CICLUL DE VIATA .......... ....... 10 N U M E D E O B I E C T E – R E F E R I N T E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 0 ORGANIZAREA MEMORIEI IN JAVA .......... ........... .......... 10 TIPURI DE DATE .......... ........... ........... ........... ........... ..... 11 DOMENIILE DE VIZIBILITATE IN JAVA .......... ........... ..... 11 VIZIBILITATEA NUMELOR ........... ........... ........... ........... . 12 CUVANTUL CHEIE STATIC............... ........... ........... ........ 12 STIL DE SCRIERE A CODULUI .......... ........... ........... ........ 12 OPERATORI ........... ........... .......... ........... ........... .......... .. 12 CONTROLUL EXECUTIEI .......... ........... ........... ........... ..... 13 INITIALIZAREA OBIECTELOR .......... ........... ........... ........ 13 SUPRAINCARCAREA METODELOR .......... ........... ........... . 13
C U V A N T U L C H E I E “ t h i s ” . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . 1 4 DISTRUGEREA OBIECTELOR .......... ........... ........... .......... 14 1
STERGEREA CORECTA A OBIECTELOR ........... ........... ..... 14 MODUL DE FUNCTIONARE A GARBAGE COLLECTORULUI . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . 1 4 INITIALIZAREA DATELOR MEMBRE: ........... ........... ........ 15 PROCESUL CREARII UNUI OB IECT: ........... ........... .......... 15 BLOCUL STATIC ................ ........... ........... ........... .......... 16 INITIALIZARE PRIN BLOC NON -STATIC ........... ........... ... 16 INITIALIZAREA SIRURILOR ........... ........... ........... .......... 16 C O N T R O L U L A C C E S U L U I – C l a s e . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . 1 6 C O N T R O L U L A C C E S U L U I – M e m b r i i C l a s e l o r . . . . . . . . . . . . .. .. . . . . . 1 6 C U R S 4 . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . 1 8 REALIZAREA CLASELOR ........... ........... ........... ........... ... 18 REUTILIZAREA CODULUI: .......... ........... ........... ........... ..... 18 INITIALIZAREA REFERINTELOR LA REALIZAREA COMPOZITIEI .......... ........... ........... ........... ........... .......... 18 SINTAXA MOSTENIRII .......... ........... ........... ........... ........ 18 I S - A v s Is Is - L i k e - A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9 OPERATIA DE DELEGARE .......... ........... ........... ........... ... 19 ASCUNDEREA NUMELOR LA MOSTENIRE ........... ........... . 19 ALEGEREA INTRE COMPOZITIE SI MOSTENIRE ........... ... 19 MECANISMUL UPCAST ........... ........... .......... ........... ....... 20 D O W N C AS A S T . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . . . 2 0 ORDINEA DE APELARE A CONSTRUCTORILOR ............... 21 C U R S 5 . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . 2 2 I n t e r f e t e . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. . . . . . 2 2 CLASE ABSTRACTE .......... ........... ........... ........... ........... . 22 CONCEPTUL DE INTERFATA .......... ........... ........... .......... 22 DESIGN P ATTERNUL STRATEGY ........... ........... ........... ... 23 DESIGN P ATTERNUL ADAPTER ........... ........... ........... ..... 23 MOSTENIREA MULTIPLA ........... ........... ........... ........... ... 23 DESIGN PATTERNUL FACTORYMETHOD . ........... ........... . 24 C U R S 6 . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . 2 5 CLASE INTERIOARE ........... ........... ........... ........... .......... 25 INNER CLASSES ........... ........... ........... ........... ........... ..... 25 CLASE INTERIOARE ANONMIE ........... ........... ........... ..... 25
2
DE CE CLASE INNER .......... ........... ........... ........... .......... 26 CLOSURES & CALLBACKS ........... ........... ........... ........... . 26 CONTROL FRAMEWORKS ........... ........... ........... ........... ... 27 MOSTENIRE DIN CLASE INNER ........... ........... ........... ..... 27 C U R S 7 . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . 2 8 COLECTII, EXCEPTII .......... ........... ........... ........... .......... 28 CONTAINERE GENERICE ................... ........... .......... ....... 28 TIPURI DE CONTAINERE JAVA ........ ........... ........... ........ 28 LUCRUL CU CONTAINERE ........... ........... ........... ........... . 29 LISTE: 2 TIPURI DE LISTE .................. ........... ........... ..... 29 I T E R A T OR O R I . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . . . 2 9 E X C E P T II I I . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. . . . 2 9 GUARDED REGIONS ........... ........... ........... ........... .......... 30 CREAREA PROPRIILOR EXCEPTII .......... ........... ........... ... 31 SPECIFICAREA EXCEPTIEI ........... ........... ........... ........... . 31 INLANTUIREA EXCEPTIILOR .................... ........... .......... 31 IERARHIA EXCEPTIILOR IN JAVA ........... ........... .......... .. 32 EXCEPTII PIERDUTE....... ........... ........... ........... ........... ... 32 RESTRICTII LA EXCEPTII .......... ........... ........... ........... ... 32 GUIDELINES: ................................................................ 32 C U R S 8 . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . 3 3 I / O J a v a . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . 3 3 SISTEMUL DE I/O INTR -UN LIMBAJ DE PROGRAMARE .... 33 CLASA FILE ........... ........... .......... ........... ........... .......... .. 33 INPUT si OUTPUT ........... ........... ........... ........... ........... ... 33 TIPURI DE InputStrea m .......... ........... ........... ........... ........ 33 TIPURI DE Out putStream ........... ........... ........... ........... ..... 34 DESIGN PATTERNUL DEC ORATOR .......... ........... ........... . 34 TIPURI DE FilterInputStream ............... ........... .......... ....... 34 TIPURI DE FilterOutputStre am ........... ........... ........... ........ 34 R E A D E R s i W R I T E R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . 35 35 R A N D O M A c c e s s F i le l e . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . . . 3 5 REALIZAREA FISIERELOR COMPRIMATE .... ........... ........ 35 F I S I E R E J A R . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . 3 5 SERIALIZARE: ........... ........... ........... ........... ........... ........ 36 3
EXTERNALIZARE ........... ........... ........... ........... ........... ... 36 EVITAREA SERIALIZARII ANUMITOR COMPONENTE ALE OBIECTELOR................................................................. 37 C U R S 9 . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . 3 8 R T T I . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . 3 8 OBIECTUL C LASS ........... ........... ........... ........... ........... ... 38 CLASS LITERAL ........... ........... ........... ........... ........... ..... 38 GENERIC CLASS REFERENCE ........... ........... ........... ........ 39 COMPARAREA OBIECTELOR DE TIP CLASS .......... .......... 39 REFLECTION ........... ........... ........... ........... ........... .......... 39 DESIGN PATTERNUL PR OXY .......... ........... ........... .......... 40 C U R S 1 0 . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . 4 1 CONCURENTA IN JAVA ..................... ........... .......... ....... 41 INTRODUCERE IN PROGRAMAREA CONCURENTA: ......... 41 EXECUTIA MA I RAPIDA A PROGRAMELOR ........... .......... 41 ABORDARI ALE LP ........... ........... ........... ........... ........... . 42 CODE DESIGN ........... ........... ........... ........... ........... ........ 42 THREADING IN JAVA ........... ........... ........... ........... ........ 42 TERMINOLOGIE ........... ........... ........... ........... ........... ..... 43 CLASA THREAD ........... ........... ........... ........... ........... ..... 43 VARIATII LA CREAREA TASKURILOR ................ ........... . 43 EXECUTORS ........... ........... .......... ........... ........... .......... .. 44 CREAREA DE THREADURI PT EXECUTORS ........... .......... 44 RETURNAREA DE VALORI DIN THREADURI ........... ........ 44 THREADURI DAEMON ................... ........... ........... .......... 45 CREAREA UNOR INTERFETE GRAFICE RESPONSIVE ....... 45 PRINDEREA EXCEPTIILOR ........... ........... ........... ........... . 45 C U R S 1 1 . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . 4 7 P a r t a j a r e a r e s u r s e l o r . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. .. . . . . . 4 7 P A R T A J A R E A R E S U R S E L O R – M U T E X . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 7 P A R T A J A R E A R E S U R S E L O R – S Y N C H R O N I Z E D . . . . . . . . . . . . . . . 4 7 MECANISM MUTEX EXPLICIT: LOCK... ........... ........... ..... 47 AVANTAJELE MECANISMULUI LOCK ........... ........... ....... 47 ATOMICITATE SI VOLATILITATE .......... ........... ........... ... 48 SECTIUNI CRITICE ........... ........... ........... ........... ........... . 48 4
STARI ALE UNUI THREAD .................. ........... ........... ..... 48 CUM SE PUNE UN THREAD IN STAREA BLOCKED .......... . 49 I N T R E R U P E R E A T A S K U R I L O R . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. .. . . . . . . . . . . . . 4 9 INTRERUPEREA TASKURILOR RULATE CU EXECUTORS . 49 COOPERAREA INTRE TASKURI ................. ........... .......... 49 DEADLOCK ................................................................... 50
5
T e or o rii e J a v a Curs 1 Cuprins: Principiile programarii obiectuale; N o t i u n e a d e o b i e c t ;
Principii de baza in obiectualitate Programarea obiectuala: Elemente din spatiul problemei precum si reprezentariile acestora in spatiul solutiei => Obiecte Caracteristici ale limbajelor obiectuale: 1. Orice element este un obiect; 2. Un program este o colectie de obiecte care isi spun unul altuia ce sa faca prin trimitere de mesaje 3. Fiecare obiect are un spatiu de memorie, posibil compus din alte obiecte 4. Fiecare obiect are un tip 5. Toate obiectele de acelasi tip pot primi acelasi mesaj (PROPRIETATEA UPCAST). Definitii: D e f i n i t i a B o s c h p e n t r u u n o b i e c t : U n o b i e c t a r e o s t a r e , u n comportament si o identitate C l a s a : E s t e u n s e t d e o b i e c t e c u c a r a c t e r i s t i c i s i f u n c t i o n a l i t a t i i d e n t i c e ( t e r m e n u l d e c l a s a s e s u b s t i t u i e termenului tip) I n t e r f a ț a : M e t o d e ( f u n c t i o n a l i t a t e ) : c e r e r i l e c a r e p o t f i
adresate unui obiect particular dintr-o clasa I m p l e m e n t a r e a : M o d c o n c r e t d e r e a l i z a r e a f u n c t i o n a l i t a t i i
Un obiect poate fi privit ca si furnizor de servicii Se imbunatateste coeziunea obiectelor (obiectele trebuie sa s e p o t r i v e a s c a b i n e u n e l e c u a l t e l e ) UML: Limbaj standardizat pentru modelarea obiectuala.
6
R e p r e z e nt nt a r e a c l a s e l o r : N u m e T i p ( n u m e l e c l a s e i ) - > L i g h t Interfata (Functionalitatiile Clasei)-> On(); Off(); Brighten(); Dim(); Definirea unui obiect din clasa Light: Light it = new Light(); Apelarea unei functii din clas a light cu ajutorul obiectului definit in clasa respectiva: It.on();
Ascunderea implementarii: Exista doua tipuri de programatori: -
-
C r e a t o r i d e c l a s e – c r e a z a c l a s e c a r e e x p u n d o a r functionalitatea necesara claselor client, restul ramane ascuns; P r o g r a m a t o r i C l i e n t – c o n s u m a t o r i d e c l a s e , r o l u l l o r e s t e sa fie echipati cu un set de clase pentru dezvolt area rapida a aplicatiilor finale
Programatorii creatori de clase trebuie sa poata schimba implementarea ascunsa fara ca programatorii clienti sa fie afectati.
SPECIFICATORII DE ACCES: Private: elementele private pot fi accesate doar de creatorul clasei in cadrul metodelor acelei clase Public: elementele publice sunt disponibile oricaror alte
clase Protected: similar cu private, utilizat in mostenire, clasele c a r e m o s t e n e s c p o t a c c e s a e l e m e n t e p r iv iv a t e d i n c l a s e l e d e b a z a .
R E U T I L I Z A R E A I M P L E M E N T A R I I – C O M P O Z I T I E Managementul complexitatii: descompunerea elementelor p r o b l e m e i i n p a r t i c o m p o n e n t e 2 Metode de realizare a complexitatii: -
Compozitie: o clasa noua contine clase existente ( relatie h a s - a ) . S e r e a l i z e a z a p r i n c r e a r e d e o b i e c t e m e m b r e . Compozitia realizata dinamic se numeste agregare.
7
R E U T I L I Z A R E A I M P L E M E N T A R I I – M O S T E N I R E Datele si functionalitatiile se pot impacheta dupa concepte care reprezinta idei similare din spatiul problemei. Mostenire: O clasa noua se aseamana (extinde) o clasa e x i s t e n t a ( R ( R e l a t i e i s - a s a u i s - l i k e - a ) .
C l a s a d e b a z a – c o n t i n e c a r a c t e r i s t i c i l e s i c o m p o r t a m e n t e l e care vor fi partajate cu tipurile derivate. Clasa Derivata contine: -
Toti membrii clasei (inclusiv cei privati care sunt ascunsi). Toata interfata clasei de baza, care este duplicata
Clasa derivata este in acelasi timp de tipul clasei de baza. M o s t e n i r e – c u m s e d i f e r e n t i a z a c l a s a d e r i v a t a d e c l a s a d e baza.
-
Prin adaugarea 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 de baza (metodele noi nu sunt accesibile din c l a s a d e b a z a – s u b s t i t u t i a n u m a i e s t e p u r a ) .
OBIECTE INTERSCHIMBABILE PRIN POLIMORFISM -
-
-
-
La ierarhiile de clase dorim sa tratam obiectele unitar sub tipul de baza, astfel putem scrie cod care nu depinde d e u n s p e c i f i c s i c a r e m a n i p u l e a z a o b i e c t e g e n e ri ri c e Se doreste ca sa se execute codul in obiectele claselor derivate fara ca sa stim (la compilare) care vor fi efectiv aceste obiecte C o m p i l a t o a r e t r a d i t i o n a l e ( n o n O O P ) – e a r l y b i n d i n g C o m p i l a t o a r e O O P – l a t e b i n d i n g – c o d u l a p e l a t e s t e determinat abia la executie, la compilare se asigura doar corespondenta tipului argumentelor si a tipului de return. J a v a – c o m p i l a t o r O O P – d y n a m i c ( l a t e ) b i n d i n g Proprietatea de UPCAST: tratarea unui obiect dintr-o clasa derivata ca si cum ar fi din clasa de baza.
8
IERARHIE CU O SINGURA RADACINA In java (si in orice limbaj de programare obiectual cu excepria c++) toate clasele mostenesc o clasa de baza numita OBJECT. Astfel, toate obiectel e din limbaj pot fi echipate in mod garantat cu o anumita functionalitate. Se usureaza implementarea garbage collectorului.
CONTAINERE - N e c e s a r e d a t o r i t a f a p t u l u i c a n u s t i m d e l a d e s i g n numarul de obiecte necesare pentru a rez olva o anumita p r o b l e m a ; - Containerele sunt siruri de referinta catre alte obiecte; - Ele se expandeaza automat pentru a salva noi obiecte , dupa necesitati; - Avem doua tipuri de liste (ArrayList si 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 datorita operatiei de DownCast. - Containere parametrizate (ArrayList
shape = new ArrayList();)
9
CURS 2-3 - N O T I U N I I N T R O D U C T I V E J A V A - INITIALIZAREA OBIECTELOR
ORGANIZAREA CODULUI -
Pentru fiecare clasa compilata se produce un fisier .class; Un program este compus dintr-o colectie de fisiere .class Acestea pot fi arhivate: fisier .jar; Fiecare fisier java incepe cu mentiunea package: se indica numele packageului din care vor face parte clasele Clasele utilizate care fac parte din alt package se importa cu “import” Toate clasele dintr-un package vor fi colectate intr-un singur subdirector; Conventie pentru denumirea packageurilor: utilizarea domeniilor de internet in ordine inversa Calea root pentru direcoare: variabila system CLASSPATH CLASSPATH poate include directoare sau fisiere .jar
CREAREA OBIECTELOR SI CICLUL DE VIATA -
Fiecare obiect necesita resurse (memorie), crearea si distrugerea obiectelor devin importante; Java utilizeaza in mod exclusive alocarea dinamica a memoriei; Pentru orice obiect, trebuie utilizat new la creare. Obiectele sunt alocate in zona de heap Distrugerea obiectelor este realizata automat de catre garbage collector; GC identifica momentul in care un obiect nu mai este utilizat si il dezaloca.
N U M E D E O B I E C T E – R E F E R I N T E -
Identificatorii prin care se manipuleaza obiectele sunt referinte catre obiecte De ex: String s; //se creaz a o referinta catre un obiect de tip string; String s = new String(“exemplu”)//referinta create este initializata Toate variabilele (referintele) create in program trebuie initializate!!!
ORGANIZAREA MEMORIEI IN JAVA -
Zona Registru : registrele procesorului, nu avem acces direct la ele Stiva: zona de stiva memoreaza referintele catre obiecte; 10
-
Heap: In aceasta zona sunt alocate toate obiectele (la apelul new) Spatiu de stocare non -RAM: Obiectele care exista in afara spatiului de memorie a programului (persistenta obiectelor),
TIPURI DE DATE Tipurile primitive:
- Variabile de dimensiune mica, salvate direct pe stiva; - N u n e c e s i t a n e w l a a l o c a r e ; - Boolean, char, byte, short, int, long, float, double si void; - Fiecare din aceste are un wrapper type pentru construirea obiectului din tipul correspondent; - A u t o b o x i n g : c o n v e r s i e a u t o m a t a d e l a u n t i p p r i m i t i v e l a wrapper: Character ch = ‘x’; Numere de inalta precizie
-
BigInteger si BigDecimal Sunt vazute ca sic lase de tip Wrapper insa nu au un tip p r i m i t i v e c o r r e s p o n d e n t ;
Siruri (Arrays) in JAVA
-
-
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 rangeului array-ului (se arunca o exceptie)
DOMENIILE DE VIZIBILITATE IN JAVA -
Intre o acolada deschisa si una inchisa a vem un domeniu de vizibilitate (la fel ca in C/C++); Java determina cand un obiect nu mai este referi t de catre nici o referinta dintr-un domeniu de vizibilitate valid => se apeleaza garbage collector pentru dezalocarea memoriei;
CLASE!!!!
-
-
Class ATypeName{/*class Body */} Clasele contin: Metode; Campuri; Modul de accesare a unui camp/metoda: objectReference.member.
11
-
Pentru datele din tipuri primitive se garanteaza i n i t i a l i z a r e a l a v a l o r i i m pl pl i c i t e ( f a l s e s i 0 ) ; Metode, argumente si tip de return: ReturnType methodName(/*argument list*/) { /*Method Body*/ }
VIZIBILITATEA NUMELOR -
-
Pentru fiecare nume de biblioteci unice, s-a realizat conventia ca fiecare programator sa isi utilizeze propriul nume de domeniu de internet ca si nume de biblioteca (ex: ro.ubbcluj.econ.gsilaghi) Punctul in numele bibliotecii reprezinta un subdirector de pe disc; Utilizarea altor component: INPORT: Inport java.util.ArrayList; // se importa o clasa; Import java.util.*; // se importa tot packageul j a v a . u t i l .
CUVANTUL CHEIE STATIC -
-
Datele membre si metodel e pot fi accesate doar sub calificarea unui obiect existent in memoria programului. Un camp sau o metoda static nu este legate de vreun obiect anume dintr-o clasa Class data sau class method; Un camp static exista o singura data pentru o clasa, fii nd p a r t a j a t d e t o a t e o b i e c t e l e c l a s e i r e s p e c t i v e ; Campurile statice pot fi referite prin numele clasei; Metodele statice sunt la nivel de clasa, pot fi referite p r i n n u m e l e c l a s e i ( f a r a a f i n e c e s a r a e x i s t e n t u n u i obiect) Metoda main; Metodele statice nu pot accesa campuri/metode ne-statice din clasa;
STIL DE SCRIERE A CODULUI - Code conventions for the java language; - N u m e l e c l a s e i d i n m a i m u l t e c u v i n t e c u c a p i t a l i z a r e a fiecarui cuvant din nume; - Pentru orice altceva (metode, camputi, referinte de obiecte) prima litera e mica;
OPERATORI -
Toti operatorii produc o valoare prin aplicarea lor; Ei pot produce si side-effects (modificarea valorii operanzilor); Operatorul de atribuire “=” 12
A=4 // atribuirea unei valori dintr-un tip primit unei variabile Daca c si d sunt obiecte, c=d; // ambele (c si d) vor referi acelasi obiect (d);
-
-
Aliasing: la transmiterea unui obiect ca si argument intro metoda, se transmite o referinta, deci modificarea valorii in metoda afecteaza valoarea obiectului din afara metodei; O p e r a t o r i i + + s i – a u f o r m a p o s t f i x a t a ( s i m i l a r c u C/C++); Operatorii == si =! Aplicati pe referinte de obiecte, compara referintele, si nu continutul obiectelor. Pentru compararea continutului obiectelor, metoda equals: n1.equals(n2). Pentru clasa String se pot folosi + si +=;
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 Iterabile Intreruperea executiei unei secvente: return, break, continue; Switch: intstructiunea de selectie din mai multe alternative.
INITIALIZAREA OBIECTELOR -
In fiecare clasa se garanteaza initializarea obiectelor p r i n s c r i e r e a u n u i c o n s t r u c t o r ; La crearea unui obiect, Java apeleaza automat constructorul clasei respective; N u m e l e c o n s t r u c t o r u l u i e s t e i d e n t i c c u n u m e l e c l a s e i Constructorul default: Nu are argumente; Constructorul nu are tip de return; Daca se creaza o clasa fara nici un constructor, compilatorul creaza in mod automat constructorul default;
SUPRAINCARCAREA METODELOR -
Utilizarea aceluias nume de metoda pentru mai multe metode cu argumente diferite; Cum diferentiaza Java intre metodele supraincarcate: aceste metode trebuie sa difere prin lista argumentelor;
13
-
La supra incarcare, primitivele din lista de argumente sun “promoted” catre tipurile mai largi Metodele nu se pot supraincarca pe tipul de return;
CUVANTUL CHEIE “this” - In fiecare metoda apelata, referinta obiectului sub care se apeleaza metoda este transmisa in metoda sub forma referintei this - This poate fi utilizat doar in interiorul metodelor nestatice - In interiorul unei metode dintr-o clasa, la apelul unei metode din clasa curenta, nu este nevoie sa se utiliz eze this. - This este frecvent utilizat in return, pentru a returna obiectul curent.
DISTRUGEREA OBIECTELOR -
-
Garbage Collectorul dezaloca memoria alocata prin new, atunci cand obiectele nu mai sunt folosite; Metoda finalize(): permite operatii de stergere inainte ca obiectele sa fie supuse garbage collectorului; Metoda finalize(): Java nu garanteaza apelarea acestei metode, programatorul nu are control asupra momentului cand se apeleaza garbage colectorul; Daca obiectele noastre agrega alte obiecte, garbage colectorul se ocupa de dezalocarea obiectelor aggregate; Finalize se utilizeaza in general pentru a implementa un termination conditions pentru un obiect(de ex: inchiderea unui fisier).
STERGEREA CORECTA A OBIECTELOR -
Java nu garanteaza apelarea metodei finalize la distrugerea obiectelor; - Ce se intampla atunci cand este necesa ca obiectele sa fie sterse daca programele se incheie cu exceptie? Se p u n e c o d u l d e s t e r g e r e i n t r o m e t o d a d i s p o s e - Metoda dispose se apeleaza pe clauza finally a unui trycatch global. - La stergerea obiectelor, aceasta trebuie sa se realizeze in ordine inversa crearii obiectelor => programul trebuie sa se asigure de acest lucru.
MODUL DE FUNCTIONARE A GARBAGE COLLECTORULUI -
GC colecteaza memoria ramasa alocata in obiectele care nu mai sunt utilizate si compacteaza heap-ul, rearanjand obiectele alocate 14
-
-
Reference counting: O modalitate de a implement a un GC: De cate ori se asociaza o refe rinta pentru un obiect, reference counterul obiectului se incrementeaza; De cate ori se pierde o referinta pentru un obiect, r e f e r e n c e c o u n t e r u l o b i e c t u lu l u i s e d e c r e m e nt nt e a z a ; GC scaneaza sirul de variabile reference counters sic and intalneste una nula, dezaloca obiectul respective. Implementarea J AVA: pentru un obiect live se poate identifica o referinta fie pe stack fie in static storage; Stop-and-copy: GC-ul opreste programul, scaneaza toate referintele de pe stack si copiaza obiectele identificate in noul heap. Cee ace ramane e garbage-ul care trbuie dezalocat, iar noul heap e deja compactat.
INITIALIZAREA DATELOR MEMBRE: -
-
-
Utilizarea unei variabile locale neinitializate => eroare de compilare; Orice data membra a unei clase, dac a este de tip p r i m i t i v e , s e g a r a n t e a z a i n i t i a l i z a r e l a v a l o a r e a implicita. Obiectele member neinitializate, vor avea valoarea null S p e c i f i c a r e a v a l o r ii i i d e i n i t i a l i z a re re : La momentul definirii variabilei primitive prin asignarea cu o valoare; La momentul definirii variabilei non-primitive, prin new. Initializarea datelor member prin constructor Ordinea de initializare a datelor member: ordinea in care acestea sunt definite in clasa; Initializarea datelor statice are loc doar daca acestea sunt necesar de a fi utilizate; Obiectele statice sunt initializate inaintea celor nonstatice, daca ele nu au fost utilizate pana atunci.
PROCESUL CREARII UNUI OBIECT: -
-
Presupunem ca avem o clasa Dog; Prima data cand un obiect de tip Dog este creat, JVM l o c a l i z e a z a p e d i s c f i s i e r u l D o g .c .c l a s s s i i l i n c a r c a ; L a i n c a r c a r e D o c . c l a s s , s e i n i t i a l i z e az az a t o t i m e m b r i s t a t i c La new Dog() se aloca memorie pe heap pentru noul obiect, aceast a zona de memorie se umple cu 0 ( p r i m i t i v el e l e s u n t i n i t i a l i z at at e l a v a l o a r e a i m p l i c i t a ) Se realizeaza toata initializarile explicite la momentul definiri datelor member Se executa constructorul;
15
BLOCUL STATIC -
-
Static{/*initializari*/} Blocul static este ape lat o singura data, la prima creare a unui obiect din clasa respective sau la apelearea unei member statice din acea clasa; Blocul static poate sa initializeze doar date statice
INITIALIZARE PRIN BLOC NON-STATIC -
{ / * o p e r at at i i * / } ; / / f a r a s t a t i c i n a i n t e ; Intre accolade se specifica operatii de initializare care trebuie effectuate indifferent de care constructor este apelat; - Blocul non-static de initializare este necesar pentru a se p e r m i t e d e f i n i r e a c l a s e l o r i n t e r n e a n o n i m e .
INITIALIZAREA SIRURILOR -
Sirurile sunt definite prin operatorul de indexare: int[]a; Pentru a se crea spatiu de memorie pentru sir, si rul trebuie initializat; Fiecare sir are un membru intrisec: length(lungimea sirului); Elementele sunt indexate de la 0 la length-1; I n t e g e r [ ] a = n e w i n t e g e r [ r a n d . n e x t I n t ( 2 0 )] )] ; / / s e c r e a z a doar un sir de referinte, fieca re din ele trebuie apoi initializate, de ex: a[i]=rand.nextInt(500);
C O N T R O L U L A C C E S U L U I – C l a s e -
Package: clase grupate impreuna intr-un singur spatiu de nume logic; Orice clasa dintr-un package poate face referire directa la o alta clasa din acelasi package; Pentru accesarea claselor din alte package-uri se utilizeaza import Lipsa definitiei de package: package-ul default; N u s e r e c o m a n d a u t i l i z a r e a a c e s t u i a ; S p e c i f i c a t or or u l d e a c c e s p u b l i c l a c l a s e ; Pentru a putea fi referita din afara packageului; Clasele fara specificator de acces: nu pot fi referite din a f a r a p a c k a g e - u l ui ui .
C O N T R O L U L A C C E S U L U I – M e m b r i i C l a s e l o r -
-
-
Public: M e m b r i i p u b l i ci ci p o t f i r e f e r i t i d i n a f a r a c l a s e l o r ; Specifica interfata claselor; Private: Pot fi referiti doar din interiorul claselor de definire; Specifica interfata claselor; F a r a s p e c i f i c a t o r d e a c c e s – a c c e s p a c k a g e ; 16
-
Pot fi referiti din clasele package-ului curent; Protected: folosit in contextual mostenirii.
17
CURS 4. REALIZAREA CLASELOR -
COMPOZITIE; MOSTENIRE; ALEGEREA INTRE MOSTERNIRE SI COMPOZITIE MECANISMUL DE UPCAST
REUTILIZAREA CODULUI: -
Inseamna mai mult decat copy-paste cod Operatii principale: Compozitie si Mostenire; Sintaxa compozitiei: se plaseaza o referinta catre un obiect nou intr-o clasa noua; - Referintele nou create se initializeaza la valoarea null -> trebuie initializate explicit; - Metoda toString: mostenita de la clasa Object: se p e r m i n t e c o n v e r t i r e a o b i e c t u l u i i n t r - u n o b i e c t S t r i n g (necesar pentru tiparire)
INITIALIZAREA REFERINTELOR LA REALIZAREA COMPOZITIEI -
Initializarea se poate realiza in 4 moduri: 1 . L a m o m e n t u l d e f i n i r i i o b i e c t u l u i – i n i t i a l i z a r e a s e f a c e inainte de apelarea constructorului; 2. In constructor; 3. Chiar inainte de utilizarea obiectului (lazy initialization) 4 . I n s t a n c e i n i t i a l i z a t i o n – i n b l o c n o n - s t a t i c d e initializare:
SINTAXA MOSTENIRII : -
-
-
M o s t e n i r e a s e r e a l i z e az az a o r i d e c a t e o r i s e c r e a z a o c l a s a : Se mosteneste din OBJECT; Mostenire: clasa noua se aseamana cu clasa veche: cuvantul cheie extends; Clasa noua va prelua automat toate campurile si metod ele din clasa de baza Regula nescrisa la mostenire: Campurile din clasele de b a z a s e s c r i u p r i v a t e i a r m e t o d e l e s e l a s a p u b l i c ( s a u p r o t e c t e d ) Clasa derivate, pentru a se apel a o metoda din clasa de b a z a s e p o a t e u t i l i z a s u p e r Realizarea mostenirii: la crearea obiecului din clasa derivate, se creaz a un subobiect din clasa de baza (ca si cum ar fi realizata o compozitie catre acesta) Initializarea subobiectului din clasa de baza: doar prin constructor; 18
-
Constructorul clasei de baza este apelat intotdeauna inaintea constructorului clasei derivate Pentru apel al constructorului clasei de baza cu argumente: Super(argumente)
IS-A vs Is-Like-A -
-
-
Relatia de mostenire de tip is-a: clasa derivate doar suprascrie interfata clasei de baza; Relatia de mostenire de tip is -like-a: clasa derivate contine metode suplimentare fata de clasa de baza Relatia de substitutie: La o relatie de tip is-a substitutia este pura: orice mesaj trimis clasei derivate poate fi omis si trimis clasei de baza (rezolvarea mesajului se face prin upcast) La o relatie de tip is-like-a: partea extinsa din clasa derivate nu mai este dinsponibila prin upcast (prin adresarea clasei de baza) D o w n c a s t : o p e r a t i a i n v e r s a u p c a s t – n u e s t e o o p e r a t i e garantata, in sensul in care nu stim exact clasa derivate catre care se face downcast; Java verifica orice conversie(cast), si daca nu se poate realiza se arunca o exceptie de tipul ClassCastException
OPERATIA DE DELEGARE -
-
O p e r a t i e i n t e r m e d i ar a r a i n t r e c o m p oz oz i t i e s i a g r e g a r e Intr-o clasa se plaseaza un obiect membru din a 2-a clasa, iar clasa noua va expune toate metodele furnizate de obiectul din clasa a 2-a Pentru reutilizarea operatiilor de mostenire/compozitie, este sufficient ca sa se importe clasele reutilizate(codul lor sursa nu este necesar)
ASCUNDEREA NUMELOR LA MOSTENIRE -
La suprascrierea unei metode, supraincarcate din clasa de b a z a , n u m e l e c a r e s u n t s u p r a i n c a r c a t e d i n c l a s a d e b a z a nu devin ascunse!!! - Supraincarcarea functioneaza indifferent unde este ea realizata: in clasa de baza sau in cea derivate
ALEGEREA INTRE COMPOZITIE SI MOSTENIRE -
Compozitia se allege atunci cand interfata clasei de baza nu se doreste a fi expusa in clasa derivate; - Compozitia se face, de obicei prin agregare private; - Mostenirea se foloseste atunci cand interfata clasei de b a z a s e d o r e s t e p r e l u a t a s i e x p u s a i n c l a s a d e r i v a t e 19
-
Protected: functioneaza ca si private in afara ierarhiei; Upcast: Obiectele din tipul clasei derivate sunt in acelasi timp si din tipul clasei de baza
FINAL -
-
-
Itemii finali: nu pot fi sctimbati (de exemplu intr-o clasa derivata) Datele final: Constante la compilare care nu se schimba ulterior Valori initializate la runtime care nu se doreste sa fie schimbate; Static final: au o singura locatie de stocare a datei. Final aplicat la o referinta: face referinta constanta, valoarea obiectului poate fi modificata Blank final: campuri declarate final care nu sunt i n i t i a l i z a t e - > e s t e t r e b u i e i n i t i a l i z at at e i n a i n t e d e utilizare; Argumente final: in metodanu se poate schimba valoare a catre care arata referinta; Metode final: nu pot fi schimbate prin mostenire; Metodele final sunt tratate inline de catre compilator; C l a s e f i n a l : s e i n h i b a m o s t e ni n i r e a d i n c l a s a r e s p e c t i ve ve ;
MECANISMUL UPCAST -
-
-
A s o c i e r e a d i n t r e n u m e l e m e t o d e i s i c o r p u l m e t o d e i – 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: necesita un mecanism pentru identificarea t i p u l u i l a e x e c u t i e R T T I – p e n t r u a s e i d e n t i f i c a i n m o d correct corpul metodei care trebuie apelat In Java se utilizeaza l ate binding pentru orice apel de metoda, cu exceptia metodelor static si final (private e implicit final pt ca o metoda private nu poate fi mostenita) De ce e nevoie sa declaram o metoda final? Pentru a inhiba late binding (creste eficienta la executie) Campurile si elementele static sunt rezolvate la compilare L e g a r e a c o n s t r u c t or o r i l o r e s t e r e a l i z a t a l a c o m p il il a r e
DOWNCAST -
-
D o w n c a s t : o p e r a t i a i n v e r s a u p c a s t – n u e s t e o o p e r a t i e garantata in sensul in care nu stim exact clasa derivate catre care se face downcast Downcast trebuie realizat explicit de catre programator 20
-
Java verifica orice conversie (cast), si daca nu se poate realiza se arunca o exceptie de tipul ClassCastException
ORDINEA DE APELARE A CONSTRUCTORILOR -
In cazul obiectelor complexe (cu mostenire), ordinea de apelare a constructorilor este: 1. Se apeleaza constructorul clasei de baza. Apelul este recursive, pana la varful ierarhiei (constructorul tipului din varf este apelat primul) 2. Se initializeaza membrii clasei in ordinea declararii acestora; Se apeleaza corpul constructorului clasei derivate;
-
Ce se intampla daca in constructor se apele aza o metoda p r e s u p u s a a s e l e g a d y n a m i c ? In constructor se apeleaza exclusive metoda s u p r a s c r i s a ( c e a d i n c l a s a c u c o n s t r u c t o r u l – l e g a r e a este de tip early) - Covariant return types: O metoda suprascrisa dintr-l clasa derivate poate returna un tip derivat dintr-un tip returnat de met oda d i n c l a s a d e b a z a ( c a r e e s t e s u p r a s c r i s a. a. )
21
CURS 5 Interfete Cuprins: CLASE ABSTRACTE INTERFETE DESIGN PATTERNUL STRATEGY SI ADAPTER DESIGN PATERNUL FACTORY
CLASE ABSTRACTE -
-
-
Rolul clasei Instrument (varful ierarhiei): sa creeze o interfata comuna claselor derivate(metoda play din Instrument este “dummy”) => obiectele din clasa instrument nu au sens (din punct de vedere logic) => clasa instrument este o clasa abstracta Pentru a Evita astfel de erori la executie(crearea de obiecte dintr-un astfel de tip) exista un mechanism prin care se declara clasele abstracte(si care verifica la compilare): cuvantul cheie abstract Clasa abstracta are cel putin o metoda abstracta (metoda declarata abstracta si care nu are corp) Se genereaza eroare la compilare daca se incearca crearea unui obiect dintr-o clasa abstracta La mostenire dintr-o clasa abstracta, metoda abstracta trebuie suprascrisa, altfel clasa derivate devine si ea abstracta.
CONCEPTUL DE INTERFATA -
-
In clasa abstracta se furnizeaza o parte din interfata iar implementarea acesteia este lasata pe seama claselor derivate Cuvantul cheie interface: produce o clasa abstracta fara nici o implementare de metode Orice code care utilizeaza o anume interfata va sti ce metode se pot apela(si doar atat) Interfetele permit realizarea “mostenirii multiple” Interfetele pot contine campuri: acestea sunt implicit static si final Implementarea unei interfete: cuvantul cheie implements
22
DESIGN PATTERNUL STRATEGY -
-
-
Crearea unei metode care sa aiba comportament diferit in f u n c t i e d e t i p u l a r g u m e n t ul ul u i c a r e s e p r e z i n t a l a i n t r a r e Metoda contine o parte fixa care este apela ta de fiecare data si o parte care variaza (strategia) In cazul In care nu se utilizeaza interfete, daca dorim sa aplicam metoda (strategia) unui obiect dintr-o clasa care nu face parte din ierarhie, nu se poate. => in exemplul Apply si Processor, exista o cumplare foarte puternica i n t r e m e t o d a A p p l y . pr pr o c e s s i c l a s a P r o c e s o r , a s t f e l i n c a t aceasta metoda nu poate fi aplicata decat obiectelor din ierarhia processor, 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 -
-
Ce se intampla in cazul in care dorim sa utiliza m in s t r a t e g i e o c l a s a i m p o r t a t a d i n t r - o a l t a b i b l i o t e c a? a? Desig patternul Adapter: se scrie cod care preia la intrare interfata existent 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 mai facil de reutilizat.
MOSTENIREA MULTIPLA -
-
-
-
In java se poate extinde o singura clasa si se pot i m p l e m e nt nt a o r i c a t e c l a s e Rolul interfetelor: sa se poata face upcast la mai mult decat o clasa de baza Daca se poate crea o clasa de baza fara d efinitii de metode si variabile member, se recomanda sa se creeze interfete in locul claselor abstracte Interfetele se pot combina(se extend 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 => eroar e la compilare. Campurile care sunt inserate intr-o interfata devin in mod automat static si final => reprez inta un mod convenabil pentru a define constant (similar cu enum) Campurile definite in interf ete nu pot fi blank finals, ele trebuie initializate la definire. 23
DESIGN PATTERNUL FACTORYMETHOD -
Rolul unei interfete: sa permita implementari multiple p e n t r u d i v e r s e c l a s e - Design patternul Factory: in loc sa se apelez e un constructor in mod direct, pentru crearea unui obiect s e apeleaza o metoda de creare a obiectului dintr-o clasa Factory. Clasa Factory implementeaza o interfata care specifica metoda de creare. - Astfel, se poate schimba la runtime o implementare a unei functionalitati cu alta.
24
CURS 6 CLASE INTERIOARE 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 ineer. 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 o b i e c t u l ui ui c l a s e i e x t e r i o a r e f a r a c a s a f i e n e v o i e d e calificare (dreptul de a accesa este asupra tuturor o b i e c t e l o r m e m br br e a l e c l a s e i e x t e r i o a r e ) Pentru a se obtine referinta la obiectul clasei exterioare (din obiectul clasei interioare) se utilizeaza OuterType.this Pentru a crea un obiect din clasa inner pornind de la un o b i e c t d i n c l a s a o u t e r s e p o a t e u t i l i z a o b i e c t . Ou Ou t e r . n e w Clasele inner sunt potrivite pentru a implementa i n t e r f e t e : s e r e a l i z e a z a a s c u n d e r e a i m p l e m e n t a ri ri i . Clasele interioare pot fi create intr-o metoda sau domeniu de vizibilitate deoarece: Se implementeaza o interfata, deci se poate crea si returna o referinta la aceasta (upcast) Se rezolva o problema complicata si dorim sa creem o clasa care sa ne ajute la rez olvarea problemei, dar nu dorim ca aceasta sa fie publica. Clasa interioara poate fi accesata doar din interiorul metodei (sau domeniului de vizibilitate) unde a fost creata,
CLASE INTERIOARE ANONMIE . -
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) definitia in afara acesteia, atunci referinta acesteia trebuie sa fie final.
25
-
Clasele anonime nu pot avea constructor, dar initializariile se pot realiza in blocul non-static de initializare. - Clasele interioare pot fi create static(nested.clases) daca nu se doreste utilizarea referintei obiectului exterior in i n t e r i o r ul ul c l a s e i i n n e r . - Clasele interioare parte a unei interfete devin automat static public. Rol: crear ea de cod comun care sa fie u t i l i z a t d e t o a t e i m p l e m en en t a r i i l e i n t e r f e t e i . - Oricat de adanca este imbricarea claselor nested, acestea p o t a c c e s a o b i e c t e m e m b r e d i n c l a s e l e e x t e r i o a r e , indiferent de nivelul de imbricare.
DE CE CLASE INNER -
-
-
-
Fiecare clas a inner poate in mod independent sa mosteneasca de la o alta implementare. Deci o clasa inner nu este limitata de faptul ca clasa exterioara mosteneste sau nu o implementare. Clasa interioara poate avea interfete multiple, fiecare cu p r o p r i a s t a r e , c a r e e s t e i n d e p e n d e n t a d e s t a r e a o b i e c t u l u i d i n c l a s a e x t e r i o a ra ra . O singura clasa exterioara poate avea mai multe clase interioare fiecare implementand aceasi interfata sau mostenind din aceasi clasa in mai multe feluri. La momentul crearii obiectului din clasa inner, acesta nu este legat de crearea obiectului din clasa outer. Inner Class este o clasa total diferita de clasa exterioara, nu exista confuzie de tipul is-a.
CLOSURES & CALLBACKS -
-
-
-
Closure: un obiect apelabil care retine informatie despre domeniul de vizibilitate in care a fost creat (are acces 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 p e r m i t e s a a p e l a m o b i e c t u l i n i t i a l l a u n m o m e n t u l t e r i o r de timp. Callback se implementeaza cu clase interioare. Clasa de tip Closure furnizeaz a o poarta in interiorul c l a s e i e x t e r i o a r e ( d a r i n t r - u n m o d s e i f – n u s e n e c e s i t a c a sa transformam accesul la metodele acestei clase) De ce callbacks? La executie, se poate schimba metoda care este apelata in mod dinamic
26
CONTROL FRAMEWORKS -
-
-
-
-
Application framework: un set de clase proiectate sa rezolve un tip anume de problema (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 partiile neschimbate ale algoritmului de cele flexibile; Control framework: un tip particular de application framework prin care sistemul raspunde la evenimente generate (sistem event-driven)- de exemplu GUI’s In implementarea Control Framework, inner class sunt utilizate pentru a exprima diversele actiuni. (metoda action)
MOSTENIRE DIN CLASE INNER -
-
La mostenire dintr-o clasa inner, trebuie furnizat la constructia obiect ului un obiect din clasa inner, pentru a se permite construirea sub-obiecului cl.baza(ecnlosingClassReference.super()) Clasele locale unui domeniu de vizibilitate au acces la toate variabilele domeniului respectiv(inclusiv cel final), insa aceste clase nu au specificator de acces.
27
CURS 7 COLECTII, EXCEPTII Sirurile de obiecte (arrays): reprezinta cel mai eficient mod p e n t r u a p a s t r a o b i e c t e . N e a j u n s : A u d i m e n s i u n e a f i x a t a l a c o m p i l a r e -
Java.util clase containere: List, Set, QUEUE, Map Pre-Java SE5: containerele java pot memora orice tip de obiecte, deci pot aparea erori De exemplu: ArrayList are metode add si get definit e utilizand clasa object. Erorile la regasirea obiectelor din container pot sa fie identificate doar la executie (ClassCasttException)
CONTAINERE GENERICE -
TipContainer In container se pot pastra doar obiecte din tipul de baza Se obtine eroare la compilare daca se incearca stocarea unui obiect dintr-un alt tip - N u m a i e s t e n e c e s a r a o p e r a t i a d e c a s t ( c o n v e r s i e ) l a regasirea obiectelor - O p e r a t i i d e e f e c t u a t l a u t i l i z a r e a c o n t a i n er er e l o r : Definirea obiectului de tip container; Inserarea de obiecte in container (de ex: Metoda add) Regasirea obiectelor(de ex Metoda get) Daca sunt containere generice nu mai este nevoie de cast; La containere pre-JavaSE, trebuie conversie.
TIPURI DE CONTAINERE JAVA -
-
-
Colectii: memoreaza o secventa de elemente individuale, impreuna cu una sau mai multe reguli aplicate acestora List: memoreaza obiecte le in ordinea in care au fost inserate; Set: nu se permit obiecte duplicat; Queue: se regaseste dupa ordinea furnizata de regula de insiruire. Map: reprezinta grupuri de perechi de tip(cheie,valoare) Intr-un Map se regaseste un obiect(valoarea) furnizata p r i n c h e i Collection, List, Set, Queue si Map reprezinta interfete. List apples = new ArrayList(); List apples = newLinkedList(); In colectii se pot adauga grupuri de elemente Collection.Array.asList() Collection.addAll() 28
LUCRUL CU CONTAINERE -
Tiparirea acestora: metoda toString; Sortare: metoda Sort
LISTE: 2 TIPURI DE LISTE -
-
ArrayList: lista implementata cu un sir. Permite operatii rapide pentru acces random la elemente. Operatiile de i n s e r a r e s i s t e r g e r e d e l a m i j l o c u l l i s t e i s u n t c o s t i s i t o a r e. LinkedList: lista implementata cu lista simplu inlatuita. Permite operatii rapide de insertie si stergere de la mijlocul listei, insa operatiile de regasire aleatoare sunt costisitoare.
ITERATORI -
-
Este un design pattern Un obiect de tip iterator este asociat unei colectii si p e r m i t e r e g a s i r e a o r d o n a t a a o b i e c t e l o r d i n c o l e c t i a respectiva; 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 directie ListIterator: furnizat doar de interfataList, poate p a r c u r g e e l e m e n t e l e c o l e c t i e i i n a m b e l e d i r e c t i i .
EXCEPTII - N u t o a t e e r o r i l e p o t f i p r i n s e l a s c r i e r e a p r o g r a m u l u i ( l a compilare) - Restul problemelor trebuie rezolvate la executie printrun mecanism prin care sa ofere programului cli ent informatia necesara rezolvarii situatiei => exception handling: singurul mecanism Java pentru tratarea erorilor. - Conceptul de exceptie: in domeniul de vizibilitat e unde apare eroarea de obicei nu stim cum sa o tratam, ins a stim ca nu putem sa continuam cu eroarea, astfel ca transmitem eroarea spre rezolvare unui domeniu de vizibilitate exterior. - Exception condition: eroarea aparuta(de exemplu impartire la 0) - La aparitia unei erori: Se creaza un obiect de tip exceptie ( pe heap cu new) 29
-
-
-
Firul de executie curent este intrerupt si referinta la obiectul exceptie este transmisa in afara contextului curent Mecanismul de excepti on handling cauta un context p o t r i v i t p e n t r u r e l u a r e a e x e c u t i e i p r o g r a m u l u i Handlerul de exceptie: locul unde se reia executi a p r o g r a m u l u i , r e c u p e r e a z a p r o g r a m u l d e l a e r o a r e a aparuta. Aruncarea unei exceptii If(t==NULL) Throw.newNullPointerException(); Obiectele de tip excepti e pot fi construite cu argumente transmise La throw se poate arunca orice obiect dintr-un tip care extind clasa Throwable(clasa radacina a ierarhiei exceptiilor) Conceptul de tranzactie: totul sau nimic Premisa fundamentala a tranzactiilor: existenta conceptului de exceptie.
GUARDED REGIONS Try { //codul care este susceptibil sa genereze exceptie } catch(Type1 tp1){ / / e x c e p t ii ii d e t i p u l 2 }catch(Type2){ //exceptii de tipul2} … Finally{ //cod care se executa indiferent de tipul de exceptie aruncat(sau nu) } -
Try-catch functioneaza ca un switch pe tipul de exceptie 2modalitati de tratare a erorilor Termination: eroarea este aruncata; Resumption: se insereaza cod try-catch pentru rezolvarea erorii.
30
CREAREA PROPRIILOR EXCEPTII -
Mostenire din clasa Exception La afisari la o eroare se recomanda utilizarea System.err in loc de System.out; - p r i n t S t a c k T r a c e ( . . ) : s e a f i s e a z a s e c v e n t a d e m e t o d e apelate pentru a ajunge la exceptie - getMessage(..): mostenit de la Throwable, e similar cu toString pentru erori; - Logging: Urmarirea executiei programului pentru a putea rezolva mai usor erorile; Java.util.logging Se creaza un obiect de tip Logger; Se pot loga mesaje de tip fine, info,servere, warning, etc.
SPECIFICAREA EXCEPTIEI -
-
La o metoda, prin throws se indica tipul erorilor care pot fi aruncate de catre metoda respectiva; Erorile de tip RuntimeException nu trebuie specificate p r i n t h r o w s Compilatorul forteaza programatorul sa specifice exceptiile Daca intr-o functioe este posibil sa apara o exceptie si p r o g r a m a t o r u l n u o s p e c i f i c a p r i n t h r o w s , a t u n c i a p a r e eroare la compilare Erorile verificate si enforced la compilare: checked exceptions Prinderea oricarei exceptii: catch(Exception e){..} Stack Trace: printStackTrace, getStackTrace Rearuncarea unei exceptii: in catch se face throw.
INLANTUIREA EXCEPTIILOR -
-
La prinderea unei exceptii si aruncarea unei alte exceptii, se doreste pastrarea lantului exceptiilor care apar; Subclasele Throwable pot sa utilizeze ca uza erorii ca si argument in constructor; Se poate folosi clauza la constructor doar la cl asele de tip Error, Exception sau RuntimeException La celelalte tipuri de erori, se poate utiliza InitCause.
31
IERARHIA EXCEPTIILOR IN JAVA -
Clasa throwable: orice mostenit din throwable poate fi aruncat cu throw; 2 tipuri de obiecte throwable: Error and Exception Exceptiile java mostenesc din clasa exception N u m e l e e x c e p t i e i e s t e s u g e s t i v p e n t r u c a u z a a p a r i t i e i exceptiei RuntimeException: sunt aruncate in mod automat de catre j a v a l a m o m e n t u l a p a r i t i e i l o r – u n c h e c k e d e x c e p t i o n s De obicei, acestea indica buguri si nu trebuie prinse cu try-catch.
EXCEPTII PIERDUTE -
Exista o clauza finally fara catch; Sau in finali se face return Programatorul nu are nici o indicatie despre exceptia p i e r d u t a
RESTRICTII LA EXCEPTII -
-
Cand se suprascri e o metoda, se pot arunca doar exceptiile de tipu specificat in metoda din clasa de baza Atentie la exceptii in constructori: constructorii trebuie sa isi incheie cu succes exe cutia pentru a aaduce obiectele intr-o stare sigura; Exception matching: se face potrivire pe cea mai apropiata clauza catch care potriveste cu tipul exceptiei.
GUIDELINES: -
Tratati exceptiile la domeniul de vizibilitate potrivit(nu p r i n d e t i e x c e p t i i d e c a t d a c a s t i t i c e s a f a c e t i c u e l e ) - La rezolvare, de obicei se rezolva problema exceptiei si se reia executia codului care a generat exceptia sau se transmite executia la un nivel superior fara reluarea codului sau se poate calcula un rezultat alternativ celui p r o d u s d e c o d u l c a r e a g e n e r a t e x c e p t i a s a u s e p o a t e executa tot ce e posibil in domeniul cure nt si se arunca in aceeasi exceptie la nivel superior sau Se poate termina p r o g r a m u l - Sa facem programele noastre simple - Sa facem programele noastre sa fe prin debugging.
32
CURS 8 I/O Java SISTEMUL DE I/O INTR-UN LIMBAJ DE PROGRAMARE -
Sistemul de I/O intr-un limbaj de programare trebuie sa fie capabil sa trateze Surse diferite de dispozitive de I/O (fisiere, consola,conexiuni de retea etc) Tipuri diferite de acces la surse(acces secvential, acces random, acces 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 invocat utiliza nd un Directory Filter, pentru a returna doar acele fisiere pentru care numele respecta un patern Interfata Filename Filter: 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 cream/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 insiruiri de obiecte din clasele I/O (design patternul Decorator)
TIPURI DE InputStream -
B y t e A r r a y I n p u t S t r e a m : p e r m i t e c a u n b u f f e r d e memorie sa fie utilizat ca si un InputStream(din buffer se extrag octeti)
33
-
-
-
StringBufferInputStream: converteste un String intr-un InputStream FileInputStream: sursa de intrare e fisier. Se furnizeaza la construirea obiectului fie un String fie un File PipedInputStream: este asociat cu PipedOutputStream ( c a r e e s t e f u r n i z a t l a c o n s t r u i r ea ea o b i e c t u l u i ) . Implementeaza conceptul de Pipe SequenceInputStrea: converteste unul sau mai multe InputStream-uri 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 d e c o r a t o r i i c a r e f u r n i z e a z a t i p u ri ri p a r t i c u l a r e d e c i t i r e .
TIPURI DE OutputStream -
ByteArrayOutputStream: creaza un buffer de memorie. Datele scrise sunt trimise in acest buffer FileOutputStream: Iesire intr-un fisier. Se constituie 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.
DESIGN PATTERNUL DECORATOR -
Decoratorul trebuie sa aiba aceeasi interfata cu obiectele decorate Decoratorul poate sa extinda maxim interfata acestor obiecte Clasele Filter sunt radacina abstracta a claselor de decorator.
TIPURI DE FilterInputStream -
DataInputStream: se pot citi tipuri primitive Buffered InputStream: citire din buffer, se previne a c c e s u l l a d i s p o z i t i v ul ul f i z i c l a f i e c a r e o p e r a t i e d e r e a d LineNumberInputStream: Tine evidenta numarului de linie citit PushBackInputStream: se poate pune inapoi in stream ultimul octet citit.
TIPURI DE FilterOutputStream -
DataOutputStream: se pot scrie date primitive PrintStream: folosit pentru formatarea afisarii BufferedOutputStream: pentru afisare optimizata prin b u f f e r
34
READER si WRITER -
Adauga functionalitatea pentru I/O la nivel de caracter sau unicode. Clasele sunt adaugate in ierarhia InputStream si O u t p u t St S t r e a m d e c i n u s e i n l o c u ie ie s t e a c e a s t a i e r a r h i e Clase adapter: InputStreamReader si OutputStreamReader Motivul pentru care au fost create: sa se permita internationalizarea 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.
RANDOM AccessFile -
Fisiere cu inregistrari cu dimensiune cunoscuta- se poate utiliza functia seek pentru pozitionare in fisier Aceasta clasa nu face parte din ierarhiile InputStream sau OutputStream Metoda getFilePointer(): returneaza pozitia in fisier Seek(): pentru a muta pointerul de fisier Lenght(): lungimea maxima a fisierului Incepand cu JDK 1.4: apar fisiere memory-mapped.
REALIZAREA FISIERELOR COMPRIMATE -
Java furnizeaza clase pentru compresie si decompresie, in ierarhia InputStream si OutputStream CheckedInputStream: GetCheckSum() produce checksum CheckedOutputStream: GetCheckSum() produce checksum DeflaterOutputStream: Varful ierarhiei de clase pentru compresie ZipOutputStream: compresie zip GZIPOutputStream: compresie GZIP InflaterInputStream: varful ierarhiei de clase pentru decompresie ZipInputStream decompresie ZIP GZIPinputStream: decompresie GZIP ZipFile/ZipEntry: poate manipula fisiere de tip ZIP.
FISIERE JAR -
JAR: Java Archive: colecteaza fisiere intr-o singura arhiva pentru a putea fi transmise in Internet Fisierul JAR contine fisierele arhivate + Fisier manifest JDK contine utilitarul JAR pentru crearea de archive JAR De obicei un fisier JAR contine Bytecode
35
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 clasa care implementeaza Serializabile poate fi convertit in sie de octeti si apoi restaurat Persistenta: durata de viata a unui obiect exista dincolo de executia unui program Pentru realizarea persistentei, obiectele trebuie s e r i a l i z a t e / de d e s e r i a l i z a t e i n m o d e x p l i ci ci t ( l i g h t w e i g h t p e r s i s t a n c e ) Pentru serializare, se creaza un obiect dintr-un tip OutputStream, acesta este „wrap ” in interiorul unui ObjectOutputStream si se utilizeaza metoda writeObject Pentru deserializare avem ObjectInputStream si r e a d O b j e c t - > s e r e c u p e r e a z a u n o bi bi e c t s i t r e b u i e f a c u t downcast Serializarea salveaza intreg webul de obiecte din spatele o b i e c t u l ui ui s e r i a l i z a t Tipul unui obiect deserializat: getClass
EXTERNALIZARE -
-
-
-
Ce se intampla daca dorim ca parti din obiect sa nu fie serializate? Sau dormi sa recreem subobiecte de la 0? I n t e r f a t a E x t e r n a l i z a b le le : e x t i n t e i n t e r f a t a S e r i a l i z a b l e 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 Externalizabile, subobiectele componente t r e b u i e s e r i a l i z a t e m a n u a l ( i n W r i t e E x t e r n al al ) i a r l a d e s e r i a l i z a r e, e , e l e t r e b u i e r e c u p e r at at e d e p e d i s c La mostenire dintr-o clasa Externalizable, se apeleaza writeExternal si readExternal a clasei de baza pentru a se asigura serializare / deserializare corecta.
36
EVITAREA SERIALIZARII ANUMITOR COMPONENTE ALE OBIECTELOR -
Prima metoda: utilizarea Externalizable; Metoda a 2 a: cuvantul cheie transient: indic a faptul ca acel camp marcat cu transient nu va fi serializat ca si p a r t e a p r o c e s u l u i a u t o m a t d e s e r i a l i z a r e - Metoda a 3 a: se adauca la clase metodele writeObject si readObject in care se furnizeaza codul programatorului p e n t r u s e r i a l i z a r e Aceste metode sunt private si sunt apelat e automat de catre writeObject si readObject a claselor ObjectOutputStream si ObjectInputStream.
37
CURS 9. RTTI RTTI -
-
Run Time Type Identification D e s c o p e r i r ea ea t i p u l u i l a e x e c u t i e s i u t i l i z a r e a a c e s t u i a 2 Tipuri de RTTI: T r a d i t i o n a l – l a c o m p i l a r e ; R e f l e c t i o n – l a e x e c u t i e ; Upcast: necesita realizarea automata a RTTI pentru invocarea automata(polimorfica) a metodei suprascrise Prin RTTI se poate identifica tipul exact al unui obiect la executie (limbajul de programare are metode pentru a realiza acest lucru)
OBIECTUL CLASS -
-
-
-
Java realizeaza RTTI prin intermediul obiectului Class Acesta contine informatie referitoare la tip, informatie c a r e p o a t e f i i n t e r o ga ga t a . Pentru fiecare cl asa pe care o avem in program, exista un obiect Class asociat. La compilarea unei noi clase, acest obiect este creat si salvat in fisierul .class. La crearea unui obiect dintr-o clasa, JVM utilizeaza un subsistem numit class loader. Toate clasele sunt incar cate in mod dinamic de catre JVM la prima utilizare a acestora(anume cand se face prima referinta la un membru static al clasei) La incarcarea unei clase, se verifica daca obiectul Class al tipului respectiv este incarcat, daca nu, se identifica fisierul .class pe disc, si octetii acestuia sunt verificati inainte sa fie incarcati. Metoda forName(): returneaza o referinta catre obiectul Class aferent unui tip. Solicita incarcarea fisierului .class daca acesta nu e deja incarcat de class loader. Metoda Object.getClass(): returneaza obiectul de tip Class aferent unui tip deja incarcat. Metode ale obiectului Class: getName, getSimpleName, getCanonicalName, isInterface, getInterfaces, getSuperclass.
CLASS LITERAL -
Referinta la obiectul de tip clas s poate fi obtinuta si astfel: NumeTip.class E s t e s e i f : p o a t e f i v e r i f i c a t l a c o m p i le le t i m e ; TYPE: pentru tipurile wrapper primitive 38
-
-
Boolean.class == boolean.TYPE Crearea unei referinte prin .class nu initializeaza obiectul de tip Class corespunzator. Pregatirea unui obiect pentru utilizare se face in 3 moduri: Incarcarea clasei, realizata de class loader, se gaseste b y t e c o d u l p e d i s c s i s e c r e a z a o b i e c t u l d e c l a s a c a t r e alte clase; Linking: se aloca spatiu de stoca re pentru membrii statici si se rezolva toate referintele realizate de clasa catre alte clase. I n i t i a l i z a r e: e : s e e x e c u t a i n i t i a l iz iz a t o r i i s t a t i c i s i b l o c u r i l e s t a t i c e d e i n i t i a l i z a r e . I n i t i a l i z a r e a e s t e intarziata pana la prima referinta la o metoda statica sau un camp non-static. Initializarea obiectului Class este amanata atata timp cat este posibil.
GENERIC CLASS REFERENCE -
-
Class: permite salvearea de referinte doar la obiectul Class a tipului respectiv. A t e n t i e : C l a s s < i n t e ge ge r > n u e s u b c l a s a a l u i Class cu toate ca integer e derivata lui N u m b e r . Class>: se permite orice tip(?-wildcard) Class: se permite orice subtip a lui Tip. Conversie de tip: metoda obiectClass.cast(referinta) Conversie in mod clasic(..)obiect nu apeleaza RTTI => nevoia pentru instance of..
COMPARAREA OBIECTELOR DE TIP CLASS -
Este diferenta intre instanceof/isInstance si compararea obiectelor de tip class cu == sau equals. La instanceOf/Is instance se tine cont de relatiile de mostenire La comparare cu == sau equals nu se tine cont de relatiile de mostenire.
REFLECTION -
Cum lucram cu obiecte a caror clase nu sunt disponibile l a c o m p il il a r e ? Java.leng.reflect Clasele Field, Method, Constructor getFields, getMethods and getConstructors
39
DESIGN PATTERNUL PROXY -
-
Proxy: Un obiect substitut, tansmis in locul unui obiect real, pentr a furniza prelucrari aditionale inainte de a transmite operatiile catre obiectul real. Dynamic proxy: se creaz a obiectul proxy dinamic si se trateaza apelurile catre metodele proxied in mod dinamic.
40
CURS 10 CONCURENTA IN JAVA INTRODUCERE IN PROGRAMAREA CONCURENTA: -
Programele scrise pana acum: secventiale; Programare concurenta: mai multe fire de executie care ruleaza in paralel - Exemple de utilizare a modelului concurent de executie in Java: Sistemul WEB clasic JSP Swing si SWT au mecanisme pentru suport concurenta - Motive pentru a realiza programe concurente: E x e c u t i e m a i r a p i d a – i n c o n d i t i i l e p r o g r a m a r i i miltiprocesor Imbunatatirea code design - Concurenta induce un cost: complexitate sporita a p r o g r a m e l o r .
EXECUTIA MAI RAPIDA A PROGRAMELOR -
-
-
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 p o t e x e c u t a m a i r a p i d Daca un task nu poate continua, se spune ca acel task este 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 m u l t e p r o c e s e l a u n m o m e n t d a t . – i m p l e m e n t a r e a concurentei la nivel de SO. Implementarea concurentei la nivel de mediu de p r o g r a m a r e : p r e s u p u n e e x i s t e n t a u n o r r e s u r s e c o m u n e s i coordonarea utilizarii acestor resurse de catre threaduri. Mai mult, procesele pot comunica intre ele.
41
ABORDARI ALE LP T a s k u r il il e c o n c u r e n t e s a f i e i z o l a t e u n e l e d e a l t e l e ( f i e c a r e f u n c t i e c o n c u r e n t a n u p r o d u c e s i d e e f e c t s ) – m o d e l u l d i s t r i b u t e d memory. -
-
C/C++ fork: se creaza procese separate gestionate de catre SO. Java: in cadrul unui singur proces gestionat de SO, se creaza mai multe taskuri prin threading C / C + + / J a v a – m o d e l u l s h a r e d m e m o r y . Java threading este preemtive: mecanismul de scheduling furnizeaza o felie de timp procesor fiecarui thread, prin intreruperea periodica a threadului care se executa si schimbarea contextului de executie catre un alt thread. Intr-un sistem multithreading cooperativ fiecare thread isi lasa controlul catr e alt thread la un anume moment => p r o g r a m a t o r u l t r e b u i e s a i n s e r e z e u n s o i d e y i e l d .
CODE DESIGN -
-
-
Unele probleme (precum cele de simulare) sunt c o n c u r e nt nt e p r i n d e f i n i t i a l o r Chiar daca sistemul pe care programul s e executa are un singur CPU, programele concurente au o claritate mai mare Java threading este preemtiv -> supor 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 Concurenta este benefica daca se lucreaza cu arhitecturi m o d e r n e d e t i p m e s s a g i n g – s i s t e m e d i s t r i b ui ui t e Prin messaging se realizeaza coordonarea proceselor intre ele (fara sa fie nevoie de partajarea de resurse)
THREADING IN JAVA -
Thread: un flux secvential de executie dintr-un proces Intr-un sistem multi threa ding, un proces poate contine mai multe threaduri concurente Programatorul poate programa fiecare dintre aceste threaduri ca si cum ar avea intreg proces orul la dispozitie
42
-
Pentru a defini un task trebuie implementata interfata Runnable In general, metoda run a acestei interfe te are o bucla care se executa atata timp cat este necesar FcT main are alocat propriul thre ad. 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 t h r e a d u ri ri l e a j u t a l a e x e c u t i a a c e s t o r t a s k u r i C r e a r e a u n u i t h r e a d e s t e o o p e r a t i e c o s t i s it it o a r e ( b a z a t a low-level pa conceptul de trhead din C) - > are sens ca sa gestionam threadurile cu grija -> distinctia tasko thread are sens Task: un anume job care trebuie realizat Thread: mecanismul care executa taskul
CLASA THREAD -
-
-
-
Pentru a crea un thread, trebuie furnizat un obiect de tip Runnable in constructorul unui obiect de tip Thread Metoda start a clasei Thread realizeaza toate initializarile necesare si apoi apeleaza metoda run a obiectului Runnable agregat. Metoda run este apelata intr-un fir nou de executie. Mecanismul pentru lansarea threadurilor in executie este non-deterministic(nu putem garanta ordinea in care schedulerul aloca procesorul diverselor taskuri) Thread.yield()-> solicita JVM sa dea controlul unui alt t h r e a d d i n p r o g r a m u l c u r e n t – p e n t r u a s o l i c i t a i n v o c a r e a schedulerului. Garbage Collectorul nu va colecta un thread neferi t decat dupa ce acesta isi tremina executia propriului run
VARIATII LA CREAREA TASKURILOR -
-
Se creaza o clasa care implementeaza Runnable. Un obiect din aceasta clasa e transmis in constructorul unui obiect de tip thread Se mosteneste din clasa Thread, si se suprascrie metoda run S e c r e a z a o c l a s a c a r e i m p l e m e n t e a z a R u n n ab ab l e . A c e a s t a clasa agrega un obiect de tip thread constr uit prin new Thread(this)
43
-
Atentie: la metodele 2 si 3 taskurile sunt pornite din constructor(cu start). -> e problematic, threadul isi poate incepe executia inainte ca constructorul sa se termine - Se prefera varianta 1 si utilizarea executorilor - Clasele care implementeaza Runnable sau exting thread p o t f i s c r i s e s i c a s i c l a s e i n n e r ( e v e n t u a l a n o n i m e )
EXECUTORS -
-
-
Java furnizeaza un nivel intermediar intr-un client si taskurile pe care acesta le executa. In loc ca clientul sa apeleze taskuril e in mod direct, un obiect intermediar va apela aceste taskuri i ndirect. Executors gestioneaza ciclul de viata a tascurilor asincrone fara sa fie nevoie sa gestionam explicit ciclul de viata a unui obiect Thread. Se creaza un ExecutorsService prin apelarea unei metode s p e c i f i c e a c l a s e i E x e c u t or or s Metoda shutdown: previne ca alte taskuri sa fie trimise catre executorService spre executie 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 taskurilor este realizat la crearea obiectului de tip ExecutorService CachedThreadPool: permite un numar variabil de threaduri. Va opri crearea de thre aduri noi pe masura ce threadurile vechi sunt reciclate SingheThreadExecutor este un FixedThreadPool cu un singur thread
CREAREA DE THREADURI PT EXECUTORS -
-
ThreadFactory: interfata pentru crearea de threaduri la cerere. Threadurile pot fi personalizate (de exemplu, threaduri daemon)- metoda newThread Obiecte implementand ThreadFactory pot fi furnizate ca si constructori pentru Executori; executor service-ul rezultat va utiliza acest threadFactory pentru crearea noilor threaduri
RETURNAREA DE VALORI DIN THREADURI -
I n t e r f a t a C a l l a b l e : m e t o d a c a l l c a r e t r e b u i e s a r e t u r n ez ez e o valoare
44
-
Obiectele Callable trebuie apelate de metoda submit a unui ExecutorService - Metoda submit produce un obiect de tip Future p a r a m e t r i z a t c u t i p u l r e z u l t a t u l u i s p e c i f i c r e t u r n a t d i n task - Obiectul Future poate fi interogat cu metoda isDone() p e n t r u a v e d e a d a c a m e t o d a c a l l a p r o d u s r e l u z t a t u l . - Metoda get() a obiectului Future obtine rezult atul produs de metoda call. Daca rezultatul nu este disponibil, metoda get este de tip blocking.
THREADURI DAEMON -
-
-
Un thread daemon furnizeaza un serviciu general p r o g r a m u l u i c a r e r u l e a z a i n b a c k g r o u n d p e d u r a t a executiei programului Intr-un program, cand toate thread-urile non daemon isi termina executia, programul este terminat, JVM omorand threadurile daemon Daca exista threaduri non-daemon care se executa, p r o g r a m u l n u s e t e r m i n a Main este executat intr-o instanta non-daemon Un thread se marcheaza ca si daemon inainte c a sa se inceapa executia acestuia la start Daca un thread daemon creaza alte threaduri, acestea devin un daemon la randul lor.
CREAREA UNOR INTERFETE GRAFICE RESPONSIVE -
-
Interfetele grafice trebuie sa raspunda rapid inputului utilizatorului chiar daca acesta presupune calcule sofisticate si de lunga durata Pentru a realiza un program care raspunde inputului utilizatorului, taskul de lunga durata trebuie rulat in thread nou (metoda run)
PRINDEREA EXCEPTIILOR -
Daca apare o exceptie in metoda run, aceast a se va p r o p a g a p a n a l a c o n s o l a i n c a z u l i n c a r e e x c e p t i a n u e rezolvata in run - Problema e rezolvata cu Executors - Exceptiile aruncat e de metoda run nu pot fi prinse cu trycatch in jurul comenzii exec a executorului - Prinderea unei exceptii arunca te de metoda run a unui thread Se implementeaza interfata Thread.UncaughtExceptionHandler, creandu-se o clasa handler de exceptie
45
Pentru threadul care ruleaza taskul, se asigneaza handlerul de exceptie cu metoda setUncaughtExceptionHandler Aceasta operatie poate fi scrisa in metoda newThread a unui ThreadFactory, si apoi se pot utiliza executorii Se poate asigna handlerul de exceptii implicit a clas ei Thread cu setDefaultUncaughtException
46
CURS 11 Partajarea resurselor P A R T A J A R E A R E S U R S E L O R – M U T E X -
Doua sau mai multe threaduri pot interfera, colizionand p e a c e e a s i r e s u r s a - Problema apare cand threadurile consumatoare se interfera cu cele producatoare pe aceeasi resursa - Este nevoie de un mecanism care sa previna doua taskuri sa utilizeze aceeasi resursa sensibila in acelasi timp - Mecanism mutex (mutual exclusion): se serializeaza accesul taskurilor la resursa partajata
P A R T A J A R E A R E S U R S E L O R – S Y N C H R O N I Z E D -
-
-
Cuvantul cheie synchronized: realizeaza mutual exclusion pentru o resursa R e s u r s a p a r t a j a t a s e i n c a p us us l e a z a i n t r - u n o b i e c t Toate metodele care utilizeaza resursa sunt marcate ca si synchronized Mecanismul synchronized: fiecare obiect are un monitor. Cand un thread intra in zona de cod sync. , threadul achizitioneaz a monitorul, si nici un alt thread nu va mai p u t e a i n t r a i n t r - o z o n a s y n c a a c e l u i a s o b i e c t Daca primul thread care a achizitionat monitorul intra intr-o noua zona sync a aceluias obiect, se tine un contor a numatului de monitoare achizitionate de thread Exista si un monitor la nivel de clasa pt sync la metode statice
MECANISM MUTEX EXPLICIT: LOCK -
Sectiuni criti ce: zonele de cod unde poate sa apara coliziunea intre threaduri Pentru un obiect de tip Lock: metodele lock() si unl ock() Imediat dupa lock()trebuie sa fie inserat un bloc tryfinally cu unlock() in finally Blocul try trebuie sa ramana comanda de return
AVANTAJELE MECANISMULUI LOCK -
-
Avantajul Lock asupra sync: in metodele sync. Pot aparea exceptii, si atunci nu exista nici o sansa sa se readuca sistemul in stare valida Cu Lock, se utilizeaza mecanismul try-finally, si finally se executa in orice situatie (chiar si la o exceptie) Sansa pt erori cu sync este mai redusa, se voi utiliza Lock doar in cazuri speciale 47
-
Exemplu de situatie speci ala: Este nevoie de lock pe o durata de timp - tryLock(): metoda non-blocking prin care se incearca achizitionarea lock-ului - tryLock(argumente): metoda care asteapta un anumit timp p t a c h i z i t i o n a r e a l o c k e r u l u i .
ATOMICITATE SI VOLATILITATE -
-
-
O operatie este atomica dac a ea nu poate fi intrerupta de thread scheduler. Ex de operatii atomice: Operatii simple executate pe tipuri primitive, altele decat long si double Vizibilitate: Modificari efectuate de un task chiar daca acestea sunt atomice, pot sa nu fie vizibile altor taskuri Mecanismul de sincronizare forteaza ca modificariile unui task sa fie vizibile in toata aplicat ia, chiar si pe multiprocesor Cuvantul cheie volatile: asigura vizibilitatea : imediat ce un thread scrie o valoare intr-o variabila volatila, acea valoare va fi disponibila pentru read Este seif sa utiliz am volatile in loc de sync, doar daca clasa are un singur camp care poate fi modificat
SECTIUNI CRITICE -
Avem nevoie de sectiuni critice daca partea critica este o b u c a t a d e c o d d i n t r - o m e t o d a Sectiunea critica poate sa fie marcata de cuvantul cheie synchronized(obiect) Monitorul se achizitioneaza pentru obiectul specificat Daca se sincronizeaza doar pe sectiuni critice 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 a c e l a s i o b i e c t c a s i t i n a a s i n c r o n iz iz a r i i
STARI ALE UNUI THREAD - N e w : s t a r e a u n u i t h r e a d e n e w i m e d i a t d u p a c e a c e s t a a fost creat. Threadul devine eligibil sa fie alocat catre CPU spre executie - Runnable: threadul poate sa fie rulat . Schedulerul nu este impiedicat de nimic ca sa puna threadul in executie. - Blocked: taskul poate si fie executat , dar exista ceva ce p r e v i n e a c e a s t a - Dead: un thread dead sau teminat nu mai poate fi alocat de catre scheduler - A realiza return din metoda run pune threadul in starea dead 48
CUM SE PUNE UN THREAD IN STAREA BLOCKED -
Metoda Sleep Metoda wait, threadul devine runnable dupa ce primest e un notify sau signal Threadul asteapta o operatie de I/O sa fie finalizata Threadul apeleaza o metoda sync si se asteapta achizitia monitorului.
INTRERUPEREA TASKURILOR -
Iesire din metoda run: verificarea unui flag si return A intrerupe executia unui task in mijlocul metodei run este similar cu a arunca o exceptie - Apelul metodei interrupt() a clasei Thread: se seteaza statusul interrupred pentru acel task - Un thread cu statusul interr upted va arunca o exceptie de tipul InterruptedException daca acest task este deja b l o c a t s a u i n c e a r c a r e a l i z a r e a u n e i o p e r a t i i b l o c a n t e - Statusul interrupted va fi resetat la momentul aruncarii exceptiei sau cand taskul apeleaza thread.interrupted.
INTRERUPEREA TASKURILOR RULATE CU EXECUTORS -
Metoda shutdown() a unui executor apeleaza Thread.interrupt() la fiecare thread pornit de executor Apelul cancel pe un obiect Future> genereaza interrupt Taskurile blocate de I/O sau sync nu se intrerup cu iterrupt Atentie: Interrupt() apare la inchiderea (close) unui socket car nu la close pe un I/O obisnuit Taskurile blocate datorit a sync nu sunt intrerupte cu interrupt Sectiunile critice gardate de ReentrantLock pot fi intrerupte.
COOPERAREA INTRE TASKURI -
-
Problema cooperari intre taskuri nu se refera la accesul la o resursa partajata Este vorba de modul in care taskurile pot lucra in comun p e n t r u a t i n g e r e a a c e l u i a s o b i e c t i v : u n t a s k t r e b u i e realizat inaintea altuia Problema fundamentala la coopeerare: Handshaking Se rezolva prin extinderea mecanismului excluderii mutiale Un task are posibilitatea de a-si suspenda executia pana in momentul in care apare un eveniment exterior lui. M e t o d e l e w a i t s i n o t i f yA yA l l a l e c l a s e i O b j e c t Wait():
49
-
Permite sa se astepte realizarea unor conditii care sunt in afara controlului taskului curent Suspenda taskul pana cand apare un notify sau un notifyAll E d i f e r i t d e s l e e p s i y i e l d – a c e s t e a n u e l i b e r e a z a lock-ul obiectelor Suspenda executia threadului si elibereaza lockul obiectului Poate avea ca si argument un numar de milise cunde Wait(), Notify() si notif yAll sunt metode ale unui Object, ele pot fi apelate doar din metode sync() Wait() apelat dintr-o metoda ne-sync genereaza IllegalMonitorStateException Wait este inglobat intr-un while Mai multe taskuri pot sa astepte dupa acela si lock p e n t r u a c e l a s i m o t i v ; Pana ca taskul sa ajunga la wait() e posibil ca alt task sa schimbe situatia si taskul sa trebuiasca resuspendat p r i n w a i t ( ) Este posibil ca taskuri diferite sa ceara ac elasi lock p e n t r u m o t i v e d i f e r i t e .
DEADLOCK -
-
Apare atunci cand taskurile asteapta utilizarea unei resurse unul dupa celalalt Apare atunci cand urmatoarele 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 astea pta sa achizitioneze o alta 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 R e z o l v a r e a s i t u a t i e i d e d e a d l o c k: k: Impiedicarea realizarii uneia dintre cele 4 conditii mentionate mai sus.
50