Java - Enkapsulacija


Java enkapsulacija

Enkapsulacija je jedna od ključnih karakteristika objektno orijentisanog programiranja (OOP). Enkapsulacija se odnosi na grupisanje polja i metoda unutar jedne klase. Sprječava pristup vanjskim klasama i promjenu polja i metoda klase. Ovo takođe pomaže u postizanju skrivanja podataka.


Primjer 1: Java enkapsulacija

class Area {

  // polja za izračunavanje površine
  int length;
  int breadth;

  // konstruktor za inicijalizaciju vrijednosti
  Area(int length, int breadth) {
    this.length = length;
    this.breadth = breadth;
  }

  // metoda za izračunavanje površine
  public void getArea() {
    int area = length * breadth;
    System.out.println("Površina: " + area);
  }
}

class Main {
  public static void main(String[] args) {

    // kreiranje objekta Area
    // prolazna vrijednost dužine i širine
    Area rectangle = new Area(5, 6);
    rectangle.getArea();
  }
}

U gornjem primjeru stvorili smo klasu pod nazivom Area. Glavna svrha ove klase je izračunavanje površine. Da bismo izračunali površinu, trebaju nam dvije varijable: dužina i širina i metoda: getArea(). Zbog toga smo ta polja i metode povezali u jednu klasu.

Ovdje se poljima i metodama može pristupiti i iz drugih klasa. Dakle, ovo nije skrivanje podataka. Ovo je samo enkapsulacija. Mi samo držimo slične kodove zajedno.



Zašto enkapsulacija?

  • U Javi nam enkapsulacija pomaže da srodna polja i metode držimo zajedno, što naš kod čini čišćim i lakim za čitanje.
  • Pomaže u kontroli vrijednosti naših polja podataka. Na primjer:

  • class Person {
      private int age;
    
      public void setAge(int age) {
        if (age >= 0) {
          this.age = age;
        }
      }
    }

    Ovdje vršimo age varijablu privatnom i primjenjujemo logiku unutar metode setAge(). Starost sada ne može biti negativna.

  • Metode getera i postavljača (eng. getter and setter) pružaju pristup našim poljima klase samo za čitanje ili samo za pisanje. Na primjer:

  • getName()  // pruža pristup samo za čitanje
    setName() // pruža pristup samo za pisanje
  • Pomaže u razdvajanju komponenata sistema. Na primjer, možemo enkapsulirati kod u više snopova.

  • Ove nevezane komponente (snop) mogu se razvijati, testirati i ispravljati nezavisno i istovremeno. Bilo kakve promjene u određenoj komponenti nemaju uticaja na druge komponente.

  • Sakrivanje podataka takođe možemo postići pomoću enkapsulacije. U gornjem primjeru, ako promijenimo varijablu dužine i širine u privatnu (private), tada je pristup tim poljima ograničen.
  • I oni su skriveni od vanjskih klasa. To se naziva skrivanje podataka.



Sakrivanje podataka

Sakrivanje podataka je način ograničavanja pristupa našim članovima podataka skrivanjem detalja implementacije. Enkapsulacija takođe pruža način za sakrivanje podataka. Možemo koristiti modifikatore pristupa za postizanje skrivanja podataka. Na primjer:


Primjer 2: Sakrivanje podataka pomoću privatnog specifikatora

class Person {

  // privatno (private) polje
  private int age;

  // getter metoda
  public int getAge() {
    return age;
  }

  // setter metoda
  public void setAge(int age) {
    this.age = age;
  }
}

class Main {
  public static void main(String[] args) {

    // kreiranje objekta Person
    Person p1 = new Person();

    // promjena godina (age) korištenjem setter metode
    p1.setAge(24);

    // pristup godinama (age) korištenjem getter metode
    System.out.println("Moje godine su: " + p1.getAge());
  }
}

U gornjem primjeru imamo age privatnog polja. Budući da je privatno, ne može mu se pristupiti izvan klase. Da bismo pristupili age, koristili smo javne metode: getAge() i setAge(). Te se metode nazivaju getter i setter metode.

Prilagođavanje metode age omogućilo nam je da ograničimo neovlašteni pristup izvan klase. Ovo je skrivanje podataka. Ako pokušamo pristupiti dobnom polju (age) iz klase Main, dobit ćemo grešku.

// error: age has private access in Person
p1.age = 24;