Inner classes Se plaseaza clase in interiorul altor clase Inner classes reprezinta un concept diferit de compozitie De obicei, clasa exterioara are o metoda care returneaza un obiect din clasa inner Tipul obiectului din clasa interioara se specifica precum: OuterClass.InnerClass Obiectul clasei interioare are un link (referinta) catre obiectul clasei exterioare care l-a creat!!! Obiectul clasei interioare poate accesa membrii obiectului clasei exterioare fara ca sa fie nevoie de calificare (dreptul de a accesa este asupra tuturor obiectelor membre ale clasei exterioare) Pentru a se obtine referinta la obiectul clasei exterioare (din obiectul clasei inner) se utilizeaza: OuterType.this Pentru a crea un obiect din clasa inner pornind de la un obiect din clasa outer se poate utiliza: obiectOuter.new Clasele inner sunt potrivite pentru a implementa interfete: se realizeaza ascunderea implementarii
Cluj-Napoca - 8-15 Noiembrie
2017 Clase interioare (II) 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 rezolvarea 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 definita
Cluj-Napoca - 8-15 Noiembrie
2017 Clase interioare anonime 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 - 8-15 Noiembrie 2017 De ce clase inner?
Fiecare clasa 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 din implementare
Clasa interioara poate avea instante multiple, fiecare cu propria stare,
care este independenta de starea obiectului din clasa exterioara 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 creerii obiectului din clasa inner, acesta nu este legat de creerea obiectului din clasa outer Inner class este o clasa total diferita de clasa exterioara, nu exista confuzie de tipul is-a
Cluj-Napoca - 8-15 Noiembrie
2017 Closures & callbacks Closure: un obiect apelabil care retine informatie despre domeniul de vizibilitate in care a fost creat (are access la variabilele din domeniul de vizibilitate unde a fost creat) => clasa interioara este un closure (deoarece are o referinta catre obiectul exterior si poate sa acceseze inclusiv membrii privati ai clasei exterioare) Callback: un obiect primeste o informatie care va permite sa apelam obiectul initial la un moment ulterior de timp Callback se implementeaza cu clase interioare Clasa de tip Closure furnizeaza o poartă în intriorul clasei exteriore (dar intr-un mod safe – nu se necesită ca sa transformam accesul la metodele acestei clase) De ce callbacks? La executie, se poate schimba metoda care este apelată, in mod dinamic
Cluj-Napoca - 8-15 Noiembrie
2017 Control frameworks Application framework: un set de clase proiectate sa rezolve un tip anume de problemă (design patternul Template Method) Pentru aplicarea application framework se mostenesc din clasele de baza si se schimba implementarea prin overriding Codul suprascris este cel care customizeaza solutia la cazul particular Template Method: contine structura de baza a algoritmului, iar partile specifice sunt apeluri la metode care pot fi override Astfel, se separa partile neschimbate ale algoritmului de cele flexibile Control framework: un tip particular de application framework prin care sistemul raspunde la evenimentele generate (sistem event-driven) – de exemplu GUIs In implementarea Control framework, inner class sunt utilizate pentru a exprima diversele actiuni (metoda action)
Cluj-Napoca - 8-15 Noiembrie
2017 Mostenire din clase inner La mostenire dintr-o clasa inner, trebuie furnizat la constructia obiectului un obiect din clasa inner, pentru a se permite construirea sub-obiectului cl. baza ( enclosingClassReference.super() ) Clasele locale unui domeniu de vizibilitate au access la toate variabilele domeniului respectiv (inclusiv cele final), insa aceste clase nu au specificator de access