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. Spriječ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, length i breadth i metodu 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. Pogledajmo primjer:

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

    Ovdje varijablu age postavljamo privatnom i primjenjujemo logiku unutar metode setAge(). Varijabla age sada ne može biti negativna.

  • Metode getter i setter pružaju pristup našim poljima klase samo za čitanje ili samo za pisanje. Pogledajmo primjer:

  • getName()  // Pruža pristup samo za čitanje
    setName() // Pruža pristup samo za pisanje
  • Pomaže u razdvajanju komponenti 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 varijable length i breadth u privatnu (private), tada je pristup tim poljima ograničen. I oni su tada skrivene 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. Pogledajmo 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 metod age koji je 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 age iz klase Main, dobićemo grešku.

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