Darsliklar Java Enkapsulatsiya. (Sinf/Class)

Java Java Enkapsulatsiya. (Sinf/Class)

Enkapsulatsiya — OOP ning birinchi ustuni. Uning mohiyati: obyektning ichki ma’lumotini tashqi dunyodan yashirib, unga faqat nazorat qilinadigan yo’llar orqali kirish. Bu ma’lumotni tasodifan yoki noto’g’ri o’zgartirishdan himoya qiladi. Bank hisobini tasavvur qiling: balansni istagan kishi to’g’ridan-to’g’ri o’zgartira olmasligi kerak.

Enkapsulatsiyama’lumot (maydonlar) va u ustidagi amallarni (metodlar) bir sinfga jamlab, ichki holatni private bilan yashirish va unga faqat public metodlar orqali kirishga ruxsat berish tamoyili.

Muammo: himoyasiz maydon

Avval maydon public bo’lganda qanday muammo yuzaga kelishini ko’ramiz. Balansni istalgan qiymatga, hatto manfiyga ham o’zgartirib bo’ladi:

class Hisob {
    public int balans = 0;
}

public class Main {
    public static void main(String[] args) {
        Hisob h = new Hisob();
        h.balans = -5000;   // mantiqan noto'g'ri, lekin ruxsat etilgan
        System.out.println("Balans: " + h.balans);
    }
}
Balans: -5000

Manfiy balans — xato, ammo public maydon bunga yo’l qo’ydi. Enkapsulatsiya buni hal qiladi.

Yechim: private + getter/setter

Maydonni private qilib yashiramiz va unga faqat tekshiruvli metodlar orqali kirishga ruxsat beramiz. Bu metodlar getter (o’qish) va setter (yozish) deb ataladi:

class Hisob {
    private int balans = 0;

    public void toldirish(int summa) {
        if (summa > 0) {
            balans += summa;
        }
    }

    public int getBalans() {
        return balans;
    }
}

public class Main {
    public static void main(String[] args) {
        Hisob h = new Hisob();
        h.toldirish(1000);
        h.toldirish(-500);   // rad etiladi
        System.out.println("Balans: " + h.getBalans());
    }
}
Balans: 1000

Endi balans to’g’ridan-to’g’ri o’zgartirilmaydi. toldirish metodi manfiy summani rad etdi. Ma’lumot endi himoyalangan.

Getter va Setter

private maydonga kirishning standart naqshi. Ularni jadvalda ko’ramiz:

Metod turi Vazifasi Nomlash Misol
Getter qiymatni qaytaradi get bilan getBall()
Setter tekshirib o’rnatadi set bilan setBall(int)

Setter tekshiruvni o’z ichiga oladi:

class Talaba {
    private int ball;

    public void setBall(int ball) {
        if (ball >= 0 && ball <= 100) {   // faqat 0-100
            this.ball = ball;
        }
    }
    public int getBall() {
        return ball;
    }
}

public class Main {
    public static void main(String[] args) {
        Talaba t = new Talaba();
        t.setBall(95);
        System.out.println("Ball: " + t.getBall());
    }
}
Ball: 95

Nega enkapsulatsiya muhim?

Enkapsulatsiya uch foyda beradi: ma’lumot himoyalanadi (noto’g’ri qiymat kirmaydi), ichki tuzilishni o’zgartirsangiz tashqi kod buzilmaydi, va sinf bilan ishlash soddalashadi. Bu — ishonchli, katta tizimlar qurishning asosidir.

Xulosa

Bu bo’limda enkapsulatsiya tamoyilini, private maydon va public getter/setter bilan ma’lumotni himoyalashni va tekshiruvli setterni ko’rib chiqdik. Enkapsulatsiya — ishonchli obyekt dizaynining poydevori. Keyingi darsda merosxo’rlik — sinflarni kengaytirishga o’tamiz.