MODUL 2 LESSON 2

MODUL 2 LESSON 2

@MrTarmoq

1. Encapsulation nima? Nimaga "Data Hiding" deyiladi?

🔹 Encapsulation – bu obyektga tegishli ma'lumotlarni (fieldlarni) tashqaridan bevosita o‘zgartirishni cheklash va faqat maxsus methodlar orqali o‘zgarishiga imkon berishdir.

Encapsulationning asosiy maqsadi:

Ma’lumotlarni himoya qilish (Data Hiding)

Obyekt ichki ishini yashirish

Tashqaridan bevosita field'larni o‘zgartirishni oldini olish

📌 "Data Hiding" deyilishining sababi obyekt ichidagi ma'lumotlar tashqi koddan yashirilgani va faqat getter-setter orqali o‘zgartirilishi.

2. Encapsulationga qanday erishamiz?

Encapsulationni amalga oshirish uchun quyidagi qoidalarga amal qilish kerak:

1️⃣ Classning fieldlarini (private) qilish

2️⃣ Getter (get) va Setter (set) methodlarini yaratish

3️⃣ Obyektga faqat getter va setter orqali ma'lumot kiritish yoki olish

Misol:

class Person {
    private String name; // Field private bo'lishi kerak
    private int age;

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

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

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        p.setName("Ali"); // Setter orqali o‘zgartiramiz
        System.out.println(p.getName()); // Getter orqali olamiz
    }
}

📌 Encapsulation orqali name field'ini to‘g‘ridan-to‘g‘ri o‘zgartira olmaymiz. Faqat getter va setter orqali ishlaymiz.

3. Encapsulationning qanday afzalliklari bor?

Encapsulation bir nechta muhim afzalliklarga ega:

Ma'lumotlarni himoya qiladiprivate field tashqi koddan himoyalangan bo‘ladi

Kod barqarorligini oshiradi – Tashqi kod encapsulated ma’lumotni noto‘g‘ri ishlatmaydi

Kod oson o‘zgaradi – O‘zgarish kiritganda faqat getter va setter methodlarini o‘zgartirsak yetarli

Qayta ishlatish imkonini beradi – Ma’lumotlar bir class ichida tartiblangan bo‘ladi

4. Getter va Setter methodlari nima vazifani bajaradi?

Getter va Setter methodlari encapsulated fieldlar bilan ishlash uchun ko‘prik vazifasini bajaradi:

🔹 Getter (get) – Obyekt fieldining qiymatini olish uchun ishlatiladi

🔹 Setter (set) – Obyekt fieldining qiymatini belgilash uchun ishlatiladi

Misol:

class Student {
    private int age;

    // Getter method
    public int getAge() {
        return age;
    }

    // Setter method
    public void setAge(int newAge) {
        if (newAge > 0) { // Validatsiya
            age = newAge;
        } else {
            System.out.println("Yosh manfiy bo‘lishi mumkin emas!");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Student s = new Student();
        s.setAge(-5); // Xatolik, yosh manfiy bo‘lishi mumkin emas
        s.setAge(22); // To‘g‘ri qiymat
        System.out.println("Yosh: " + s.getAge());
    }
}

📌 Setter validatsiya orqali noto‘g‘ri qiymat berilishining oldini oladi.

5. Getter va Setter methodlari ishlatilishidagi xatolar

🚨 Getter va Setter methodlaridan foydalanishda quyidagi xatolarga yo‘l qo‘yish mumkin:

1. Getter va Setter-larsiz private field-larni ishlatish

📌 Agar private field-lar uchun getter va setter yozilmasa, ularni tashqi koddan ishlata olmaymiz.

2. Setter methodda noto‘g‘ri validatsiya

📌 Agar setter methodga noto‘g‘ri yoki yetarli validatsiya qo‘shilmasa, obyekt ichidagi ma’lumot noto‘g‘ri bo‘lib qolishi mumkin.

Yaxshi yondashuv:

public void setSalary(double salary) {
    if (salary > 0) { 
        this.salary = salary;
    } else {
        throw new IllegalArgumentException("Ish haqi manfiy bo‘lishi mumkin emas!");
    }
}

3. Encapsulationni buzish

📌 Agar field'larni public qilib qo‘ysak, getter va setter methodlari o‘z ma’nosini yo‘qotadi.

4. Getter methoddan noto‘g‘ri foydalanish

📌 Agar getter method obyekt ichidagi ma'lumotni noto‘g‘ri formatda qaytaradigan bo‘lsa, bu kelajakda xatolarga olib keladi.

To‘g‘ri yondashuv:

public String getFullName() {
    return firstName + " " + lastName;
}

🚨 Noto‘g‘ri:

public String getFullName() {
    return lastName + ", " + firstName;
}

📌 Bu noto‘g‘ri bo‘lishi mumkin, chunki har bir dasturchi bunday formatni kutmaydi.

1. Package'lar bizga nimaga kerak?

Package — bu Java'dagi classlarni guruhlash va tartibga solish uchun ishlatiladigan mexanizm. U classlarni, interface'larni, va boshqa elementlarni tashkil qiladi va ular o‘rtasida nomlar to‘qnashuvini (name collision) oldini oladi.

Package'larning asosiy foydalari:

  • Tartibga solish: Dasturda ishlatilayotgan classlar, interface'lar va boshqa obyektlar bir joyga jamlanadi.
  • Nomlar to‘qnashuvi oldini olish: Xuddi bir nomdagi class'lar turli package'larda bo‘lishi mumkin.
  • Access Modifiers yordamida xavfsizlik: Package ichidagi elementlarni tashqi kodlardan himoya qilish.
  • Modularizatsiya: Katta tizimlarda kichik va alohida modullarni yaratishda yordam beradi.

2. Package'larni qanday nomlash kerak?

Package nomlarini quyidagi qoidalarga amal qilib nomlash kerak:

  1. Mantiqiy tartibda nomlash: Dasturdagi componentlar bir-biriga bog‘liq bo‘lishi kerak. Misol uchun, com.companyname.projectname.module.
  2. Kichik harflar bilan nomlash: Java package nomlari odatda kichik harflar bilan yoziladi. Agar ko‘p so‘zlardan iborat bo‘lsa, ular nuqta (.) bilan ajratiladi.
  3. Domen nomi asosida nomlash: Ko‘pincha internet domeni (domain name) asosida nomlanadi, masalan, com.google.android, org.apache.http va hokazo.
  4. Mantiqiy yondashuv: Har bir package o‘zining vazifasiga mos nom bilan atalishi kerak. Misol: com.companyname.data, com.companyname.ui.

3. Package azolari (members) deb nimaga aytiladi?

Package azolari (members) — bu package ichida joylashgan class'lar, interface'lar, enum'lar va boshqa Java elementlaridir.

Package a'zolari quyidagilarni o‘z ichiga oladi:

  • Classlar: Dasturdagi asosiy obyektlar.
  • Interface'lar: Abstrakt turdagi interfeyslar.
  • Enum'lar: Cheklangan o‘zgaruvchi turlar.
  • Subpackage'lar: Kichikroq package'lar.
  • Boshqa elementlar: Masalan, inner class'lar yoki static block'lar.

4. Tashqaridagi package azolaridan qanday foydalanish turlari bor?

Tashqaridagi package azolaridan foydalanish uchun bir nechta turli yondashuvlar mavjud:

1. Import orqali foydalanish

Dasturga tashqaridan package'dan elementlarni import qilish mumkin.

import java.util.Scanner;  // Scanner classni import qilish
  • Single import: Faqat bitta class yoki interface import qilinadi.
  • Wildcard import: Butun package'dan barcha class'lar import qilinadi.
import java.util.*;  // Barcha class'larni import qilish

2. Qualified name orqali foydalanish

Agar import qilmasdan to‘g‘ridan-to‘g‘ri fully-qualified name orqali foydalanmoqchi bo‘lsak, package nomi va class nomini birgalikda yozamiz.

public class Main {
    public static void main(String[] args) {
        java.util.Scanner scanner = new java.util.Scanner(System.in);  // Package nomi va class nomi birga yoziladi
    }
}

3. Static import

Agar class ichidagi static memberlardan foydalanish kerak bo‘lsa, static import yordamida static method'larni yoki constant'larni import qilish mumkin.

import static java.lang.Math.PI;  // Math class'dan PI constant'ini import qilish


Report Page