Java 8 clase imbricate și expresii lambda

O clasă imbricată este un membru al clasei în care este îmbrăcată. Clasele interne au acces la membrii clasei în care sunt imbricate, chiar dacă acești membri sunt declarați cu modificatorul privat. pentru aceasta, compilatorul creează metode speciale pentru accesarea acestor câmpuri, astfel încât mașina virtuală nu încalcă principiile OOP.







Ca membri ai unei clase, clasele imbricate pot fi declarate cu cuvântul cheie privat. protejat. publice sau fără un modificator de acces (pachet-privat).

Clasa exterioară (OuterClass) poate fi doar publică sau pachet-privat!

De ce să folosiți clase imbricate

Motive pentru utilizarea claselor imbricate în Java:

  • Gruparea logică a claselor care sunt utilizate numai într-un singur loc. Dacă o clasă este folosită doar de o altă clasă, atunci este logic să o înscrieți în această clasă pentru a desemna relația dintre ei.
  • Creșterea încapsulării. Dacă clasa B ar trebui să se refere la membrii clasei A. care altfel ar fi declarate private. atunci are sens să pună clasa B în clasa A. Apoi, acești membri pot fi declarați privați. dar B le poate adresa. În plus, B poate fi ascuns de lumea exterioară.
  • Îmbunătățirea citirii și menținerii codului. Clasele mici pot fi puse în clase externe, mai aproape de locul de utilizare.

Clase statice imbricate

Clasele de imbricare statică sunt asociate clasei lor externe în același mod ca metodele și variabilele.

Și, la fel ca metodele statice, nu pot accesa variabilele de instanță și metodele instanțelor clasei externe în care sunt imbricate direct, pot accesa ele doar printr-o referință de obiect. Prin intermediul unei referințe de obiect, aceștia pot accesa membrii instanțelor de clasă externe, indiferent de modificatorul lor de acces.

Clasele imbricate statice pot accesa membrii statici ai clasei în care sunt imbricate, cu orice modificator de acces.

Astfel de clase interioare sunt de obicei logic legate de clasa lor exterioară. Ei au acces la toate câmpurile acestei clase externe. Exemple ale acestor clase pot fi create într-o clasă externă și, cu acces suficient, de alte clase din alte pachete.

Clasele imbricate non-statice care fac parte dintr-o clasă pot fi declarate împreună cu oricare dintre modificatorii privați. protejat. public sau fără un pachet-modificator privat.

Clasele locale

O clasă locală este o clasă care nu este membru al unei alte clase și are un nume.

Clasele locale nu pot avea nici un modifiant de acces: nici unul privat. nici protejate. nici public.

Expresia unei clase anonime constă în:

  • Operațiuni noi.
  • Numele interfeței pentru implementare sau clasa parentală. În acest exemplu, este utilizată interfața MyInterface.
  • Parentheses cu argumente pentru constructorul clasei părinte. O clasă anonimă nu poate declara noi constructori în corpul său, deoarece nu are un nume.
  • Corpul clasei.

O clasă anonimă nu poate fi niciodată abstractă (clasele abstracte vor fi discutate mai târziu).







O clasă anonimă este întotdeauna implicită finală.

Clasele anonime se pot referi la variabilele metodei în care sunt declarate, dacă aceste variabile sunt declarate finale. sau sunt definitive prin acțiune, adică nu se schimbă.

Variabile de umbrire

Dacă numele variabilei din orice zonă are același nume ca variabila din regiunea exterioară, atunci această variabilă umbrește variabila din regiunea exterioară. Nu puteți accesa o variabilă dintr-o zonă externă pur și simplu după nume. Exemplul de mai jos arată modul de accesare a variabilei umbrite:

În acest exemplu, parametrul x al metodei metode1 umbrește pe cel al clasei SecondInnerClass. și x de la umbrele SecondInnerClass x de la FirstInnerClass. și x de la FirstInnerClass închide x de la ShadowClass, respectiv.

Rețineți referința la x din diferitele nivele de cuibare ale clasei (x.

Expresii Lambda

Adesea, o clasă anonimă implementează o interfață care conține numai o singură metodă abstractă. În acest caz, codul poate fi scris chiar mai scurt și clar dacă folosiți expresii lambda.

O interfață care conține numai o singură metodă abstractă se numește o interfață funcțională. O interfață funcțională poate conține, de asemenea, orice număr de metode statice și metode implicite. Interfețele vor fi analizate mai detaliat în articolul corespunzător.

Expresia lambda constă în:

  1. Lista parametrilor formali, separate prin virgule și închise în paranteze. Dacă parametrul formal este doar unul, atunci parantezele pot fi omise. Dacă nu există parametri formali, atunci se utilizează doar paranteze goale. Tipul operatorilor formali poate fi specificat, dar nu este necesar.
  2. Jetonul este săgeți ->.
  3. Un organism alcătuit dintr-un operator / declarație sau dintr-un bloc de declarații / instrucțiuni. În cazul unui bloc de declarații și al unei alte metode decât void, cuvântul cheie de retur este utilizat pentru a returna valoarea. În cazul unei singure expresii, rezultatul expresiei lambda este rezultatul acestei expresii. Blocul de instrucțiuni poate fi gol.

Aceasta este o eroare de compilare, deoarece variabila x din această zonă este deja declarată.

Tipul de rezultat al expresiei lambda va fi așa cum era de așteptat în acest moment, astfel încât expresiile lambda pot fi utilizate numai în cazul în care compilatorul Java poate determina tipul său:

Expresiile Lambda pot fi serializate dacă argumentele și rezultatul lor sunt serializabile, dar nu este strict recomandat să facă acest lucru.

Unele dintre interfețele funcționale ale pachetului java. UTIL. funcţia:

consumator - conține o metodă cu un obiect ca parametru fără rezultatul metodei.

funcție - conține o metodă cu un obiect ca parametru, ceea ce returnează un alt obiect ca rezultat.

predicat - conține o metodă cu un obiect ca parametru, care returnează rezultatul booleanului.

Furnizor - conține o metodă fără parametri care returnează obiectul.

Referințe la metode

Dacă expresia lambda apelează numai o anumită metodă sau constructor, puteți folosi o referință de metodă.

Când să folosiți clase imbricate, clase locale, clase anonime și expresii lambda

Utilizați clase locale. dacă intenționați să creați mai mult de o instanță a unei clase, utilizați un constructor sau doriți să introduceți un nou tip denumit.

Utilizați clase anonime. dacă trebuie să adăugați câmpuri sau metode suplimentare.

Utilizați expresii lambda. dacă aveți nevoie de o instanță a unei interfețe funcționale sau dacă intenționați să transferați o acțiune pe o altă metodă, de exemplu un handler de evenimente.

Utilizați clasa imbricată. dacă aveți aceleași cerințe ca pentru clasa locală, dar doriți să o faceți mai largă. Dacă aveți nevoie de acces la variabile de clasă externe, utilizați o clasă imbricată non-statică (clasa interioară), altfel utilizați o clasă imbricată statică.

Mai multe intrări din această categorie:

Multe, este dificil, dar fezabil. Dar merită să se închidă pe un începător sau mai bine să vină atunci? (Cunosc AscleScript 3 bine)
=
Un alt lucru: am citit că clasele interioare sunt strâns legate de evenimentele din Java. Și în acest capitol despre acest cuvânt. Și, în general, în lista de articole despre Java nu există nici un articol "Evenimente Java 8".
Deși poate că nu am înțeles corect.







Articole similare

Trimiteți-le prietenilor: