Încapsularea datelor este cel mai important concept de înțeles la programarea cu obiecte. În programarea orientată pe obiect încapsularea datelor se referă la:
Combinarea datelor și modul în care acestea sunt manipulate într-un singur loc. Acest lucru se realizează prin statul (câmpurile private) și comportamentele (metodele publice) ale unui obiect.
Permitând accesarea și modificarea numai a stării unui obiect prin comportamente. Valorile conținute în starea unui obiect pot fi apoi controlate cu strictețe.
Ascunderea detaliilor modului în care funcționează obiectul. Singura parte a obiectului care este accesibilă lumii exterioare sunt comportamentele sale. Ceea ce se întâmplă în acele comportamente și modul în care starea este stocat este ascuns privirii.
Aplicarea încapsulării datelor
În primul rând, trebuie să ne proiectăm obiectele astfel încât să aibă stare și comportamente. Creăm câmpuri private care dețin metodele de stat și publice care sunt comportamentele.
De exemplu, dacă proiectăm un obiect de persoană, putem crea câmpuri private pentru a stoca prenumele, prenumele și adresa unei persoane. Valorile acestor trei câmpuri se combină pentru a face starea obiectului. De asemenea, am putea crea o metodă numită displayPersonDetails pentru a afișa valorile prenumelui, prenumelui și adresei pe ecran.
În continuare, trebuie să realizăm comportamente care să acceseze și să modifice starea obiectului. Acest lucru poate fi realizat în trei moduri:
Metode constructoare. O nouă instanță a unui obiect este creată prin apelarea unei metode de constructor. Valorile pot fi trecute la o metodă de constructor pentru a seta starea inițială a unui obiect. Există două lucruri interesante de remarcat. În primul rând, Java nu insistă că fiecare obiect are o metodă de constructor. Dacă nu există nicio metodă, starea obiectului folosește valorile implicite ale câmpurilor private. În al doilea rând, pot exista mai multe metode de constructor. Metodele vor diferi în ceea ce privește valorile care le sunt transmise și modul în care setează starea inițială a obiectului.
Metode de accesorizare. Pentru fiecare domeniu privat, putem crea o metodă publică care să-i returneze valoarea.
Metode mutatoare. Pentru fiecare domeniu privat, putem crea o metodă publică care să-i stabilească valoarea. Dacă doriți să fie citit doar un câmp privat, nu creați o metodă de mutare pentru acesta.
De exemplu, putem proiecta persoana obiect pentru a avea două metode de constructor. Primul nu ia valori și pur și simplu setează obiectul să aibă o stare implicită (adică, numele, prenumele și adresa ar fi șiruri goale). Al doilea stabilește valorile inițiale pentru prenumele și prenumele din valorile care i-au fost transmise. De asemenea, putem crea trei metode de accesorizare numite getFirstName, getLastName și getAddress care returnează pur și simplu valorile câmpurilor private corespunzătoare. Creați un câmp mutator numit setAddress care va seta valoarea câmpului privat de adresă.
În cele din urmă, ascundem detaliile de implementare ale obiectului nostru. Atâta timp cât rămânem să păstrăm câmpurile de stat private și comportamentele publice, nu există nicio cale ca lumea exterioară să știe cum funcționează obiectul intern.
Motive pentru încapsularea datelor
Motivele principale ale utilizării încapsulării datelor sunt:
Menținerea legală a stării unui obiect. Forțând un câmp privat al unui obiect să fie modificat prin utilizarea unei metode publice, putem adăuga cod în metodele mutator sau constructor pentru a ne asigura că valoarea este legală. De exemplu, imaginați-vă că obiectul persoană stochează și un nume de utilizator ca parte a stării sale. Numele de utilizator este folosit pentru a vă conecta la aplicația Java pe care o construim, dar este limitat la o lungime de zece caractere. Ce putem face este să adăugăm cod în metoda mutatorului utilizatorului care să ne asigurăm că numele de utilizator nu este setat la o valoare mai mare de zece caractere.
Putem schimba implementarea unui obiect. Atâta timp cât păstrăm metodele publice la fel, putem schimba modul în care obiectul funcționează fără a rupe codul care îl folosește. Obiectul este, în esență, o „cutie neagră” pentru codul care îl numește.
Reutilizarea obiectelor. Putem folosi aceleași obiecte în aplicații diferite, deoarece am combinat datele și modul în care acestea sunt manipulate într-un singur loc.
Independența fiecărui obiect. Dacă un obiect este codat incorect și cauzează erori, este ușor de testat și de remediat, deoarece codul este într-un singur loc. De fapt, obiectul poate fi testat independent de restul aplicației. Același principiu poate fi utilizat în proiecte mari, unde diferiți programatori pot fi alocați creării de obiecte diferite.