Java Encapsulation


Zapouzdření

Smyslem Encapsulation je zajistit, aby "citlivá" data byla před uživateli skryta. Abyste toho dosáhli, musíte:

  • deklarovat proměnné/atributy třídy jakoprivate
  • poskytují veřejné metody get a set pro přístup a aktualizaci hodnoty private proměnné

Získejte a nastavte

Z předchozí kapitoly jste se dozvěděli, že k privateproměnným lze přistupovat pouze v rámci stejné třídy (externí třída k nim nemá přístup). Je však možné k nim přistupovat, pokud poskytujeme veřejné metody získávání a nastavení .

Metoda getvrací hodnotu proměnné a setmetoda nastavuje hodnotu.

Syntaxe obou je taková, že začínají buď getnebo set, za kterým následuje název proměnné, přičemž první písmeno je velké:

Příklad

public class Person {
  private String name; // private = restricted access

  // Getter
  public String getName() {
    return name;
  }

  // Setter
  public void setName(String newName) {
    this.name = newName;
  }
}

Příklad vysvětlen

Metoda getvrací hodnotu proměnné name.

Metoda setvezme parametr ( newName) a přiřadí jej nameproměnné. Klíčové thisslovo se používá k odkazování na aktuální objekt.

Protože je však nameproměnná deklarována jako private, nemůžeme k ní přistupovat mimo tuto třídu:

Příklad

public class Main {
  public static void main(String[] args) {
    Person myObj = new Person();
    myObj.name = "John";  // error
    System.out.println(myObj.name); // error 
  }
}

Pokud byla proměnná deklarována jako public, očekávali bychom následující výstup:

John

Při pokusu o přístup k privateproměnné se však zobrazí chyba:

MyClass.java:4: error: name has private access in Person
    myObj.name = "John";
         ^
MyClass.java:5: error: name has private access in Person
    System.out.println(myObj.name);
                  ^
2 errors

Místo toho používáme metody getName()a setName()pro přístup a aktualizaci proměnné:

Příklad

public class Main {
  public static void main(String[] args) {
    Person myObj = new Person();
    myObj.setName("John"); // Set the value of the name variable to "John"
    System.out.println(myObj.getName());
  }
}

// Outputs "John"


Proč zapouzdření?

  • Lepší kontrola atributů tříd a metod
  • Atributy třídy lze nastavit pouze pro čtení (pokud používáte pouze getmetodu) nebo pouze pro zápis (pokud používáte pouze setmetodu)
  • Flexibilní: programátor může změnit jednu část kódu, aniž by ovlivnil ostatní části
  • Zvýšená bezpečnost dat