Java Enkapsulatsiya. (Sinf/Class)

Enkapsulatsiya - bu ma’lumotni o’rash. U shunday mexanizmki, ma’lumot va uni o’zgartiruvchi kod bitta birlikda saqlanadi. Yana bitta ta’rif shuki, ma’lumotga tashqaridan to’g’ridan-to’g’ri murojaatni cheklaydi.

Dasturlash nuqtai nazaridan qaraganda, classning ma’lumotlari yoki o’zgaruvchilari boshqa classlardan yashiriladi va faqatgina joriy classda yozilgan maxsus metodlar yordamida murojaat qilinadi.

Class ma’lumotlarini boshqa classlardan yashirish uchun o’zgaruvchilar private sifatida e’lon qilinadi va bu konsepsiya data-hiding (ma’lumotni yashirish) deyiladi. Abstraksiya konsepsiya esa classning implementatsiyasi (vazifaning bajarilishi) yashirilishini anglatadi.  Enkapsulatsiya shu ikkala konsepsiya o’zida birlashtiradi.

Enkapsulatsiyani dasturda ishlatish uchun classning barcha maydonlari (o’zgaruvchilari) private sifatida yaratiladi va ularga murojaat qilish uchun maxsus getter-setter metodlar yoziladi.

Quyidagi misolda enkapsulatsiya qoidalari asosida yozilgan kodni ko’rishingiz mumkin:

class User {
   private String name;
   private String website;

   User(){
   }

   User(String name, String website) {
       this.name = name;
       this.website = website;
   }

   public String getName() {
       return name;
   }

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

   public String getWebsite() {
       return website;
   }

   public void setWebsite(String website) {
       this.website = website;
   }

}

class Main{
   public static void main(String[] args) {
       User user1 = new User("Hasan", "uzbekdevs.uz");
       User user2 = new User();
       user2.setName("Husan");
       user2.setWebsite("blogpost.uz");
       System.out.println(user1.getName() + " " + user1.getWebsite()); // Hasan uzbekdevs.uz
       System.out.println(user2.getName() + " " + user2.getWebsite()); // Husan blogpost.uz
   }
}

Enkapsulatsiyaning afzalliklari:

  • Ma’lumotlar xavfsizligi - data hiding va abstraksiya natijasida xavfsizlik yuqori darajada ta’minlanadi. Kod implementatsiya foydalanuvchidan yashiriladi.
  • Moslashuvchanlik - getter/setter metodlarining mavjudligi classni turli shakllarda yozish imkonini beradi, ya’ni classni write-only (faqat yozish uchun) yoki read-only (faqat o’qish uchun) qilish mumkin. Bunga doir misollarni keyinroq keltiramiz.
  • Qayta-qayta foydalanish - enkapsulatsiya natijasida classning parametrlaridan ko’plab marotaba foydalanish mumkin.
  • Testlash uchun oson - classning har bir elementi uchun alohida murojaat methodlari yozilgani bois, ularni alohida-alohida testlash ancha oson va samarali bo’ladi.

Read-only classga misol:

public class User {
   private String name;
   private String website;

   User(String name, String website) {
       this.name = name;
       this.website = website;
   }

   public String getName() {
       return name;
   }

   public String getWebsite() {
       return website;
   }

}

class Main{
   public static void main(String[] args) {
       User user1 = new User("Jasur", "uzbekdevs.uz");
       System.out.println(user1.getName() + " " + user1.getWebsite()); // Jasur uzbekdevs.uz
       user1.setName("Komil"); // compilation error
   }
}

Write-only classga misol:

public class User {
   private String name;
   private String website;
   
   User(){
       
   }
   
   public void setName(String name) {
       this.name = name;
   }

   public void setWebsite(String website) {
       this.website = website;
   }
}

class Main{
   public static void main(String[] args) {
       User user1 = new User();
       user1.setName("Hamdam");
       user1.setWebsite("hamdam.uz");
       user1.getWebsite(); // compilation error
   }
}