MODUL 2 LESSON 2
@MrTarmoq1. 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 qiladi – private 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:
- Mantiqiy tartibda nomlash: Dasturdagi componentlar bir-biriga bog‘liq bo‘lishi kerak. Misol uchun,
com.companyname.projectname.module. - Kichik harflar bilan nomlash: Java package nomlari odatda kichik harflar bilan yoziladi. Agar ko‘p so‘zlardan iborat bo‘lsa, ular nuqta (.) bilan ajratiladi.
- Domen nomi asosida nomlash: Ko‘pincha internet domeni (domain name) asosida nomlanadi, masalan,
com.google.android,org.apache.httpva hokazo. - 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