Sobes.tech
Junior

Java'da qaysi hollarda final modifikatori qo'llanilishi mumkin?

sobes.tech AI

AIdan javob

Java'da final modifikatori quyidagi holatlarda qo'llaniladi:

  1. O'zgaruvchilar:

    • Mahalliy o'zgaruvchilar: Ularning qiymati bir marta tayinlanadi va tayinlanganidan keyin o'zgartirilmaydi.
    • Sinf maydonlari: Maydonning qiymati e'lon qilish yoki konstruktor davomida tayinlanadi va keyin o'zgartirilmaydi.
    • Metod parametrlari: Metod ichidagi parametr konstantaga aylanadi; metod tanasida uni qayta tayinlash mumkin emas.

    final ni o'zgaruvchilarga qo'llash quyidagi afzalliklarni ta'minlaydi:

    • O'zgarmaslik: Qiymat o'zgarmasligini kafolatlaydi.
    • Ipga xavfsizlik: final sinf maydonlari konstruktor tugagandan so'ng barcha iplar uchun ko'rinadigan bo'ladi, qo'shimcha sinxronizatsiz.
    • Kompilyator optimallashtirishlari: Qiymat o'zgarmasligini bilgan holda, kompilator ba'zi optimallashtirishlarni amalga oshirishi mumkin.
  2. Metodlar:

    • final deb e'lon qilingan metodlar voris sinflarda qayta yozib bo'lmaydi.
    • Bu quyidagilar uchun foydalidir:
      • Nomaqbul xatti-harakatlarni oldini olish: Metod mantiqasi o'zgarmasligini ta'minlaydi.
      • Kompazitsiyani rag'batlantirish: Meros o'rniga kompozitsiyadan foydalanishni qo'llab-quvvatlaydi.
      • Kompilyator optimallashtirishlari: Kompilator final metod chaqiruvlarini inline qilishi mumkin.
  3. Klasslar:

    • final deb e'lon qilingan klass voris ololmaydi.
    • final ni klasslarda qo'llash quyidagilar uchun:
      • O'zgarmas (immutable) klasslar yaratish: Masalan, primitiv turlarining o'ram klasslari (Integer, String).
      • Dizaynni himoyalash: Kengaytirishni oldini oladi, bu klassning invariantsini buzishi mumkin.
      • Xavfsizlikni oshirish: Klassning xatti-harakatlarini vorislar orqali o'zgartirish mumkin emasligini kafolatlaydi.
Qo'llash Tavsifi Afzalliklar
final maydon Qiymat bir marta tayinlanadi (e'lon qilish yoki konstruktor). O'zgarmaslik, ipga xavfsizlik, optimallashtirishlar.
final parametr Qiymat metod ichida o'zgartirilmaydi. Aniq imzo, parametrning o'zgarmasligini kafolatlash.
final metod Voris sinflarda qayta yozib bo'lmaydi. Xatti-harakat o'zgarishini oldini olish, kompozitsiyani rag'batlantirish, optimallashtirishlar.
final klass Voris ololmaydi (meros olish mumkin emas). O'zgarmas klass, dizaynni himoyalash, xavfsizlikni oshirish.

Misollar:

public class Example {
    // final klass maydoni
    private final String name;

    // final primitiv maydon
    private final int id;

    // final, lekin hali yaratilmagan List ob'ektiga referensga ega bo'lishi mumkin
    // ob'ekt yaratilgandan so'ng, referensni o'zgartirish mumkin, lekin referens o'zi emas
    private final List<String> items;

    // Kompilatsiya vaqtidagi konstant
    public static final double PI = 3.14159;

    public Example(String name, int id) {
        this.name = name; // final maydoniga tayinlash
        this.id = id;     // final maydoniga tayinlash
        this.items = new ArrayList<>(); // final maydonini boshlash
    }

    // final metod
    public final void printDetails() {
        System.out.println("Name: " + name + ", ID: " + id);
    }

    // final parametrli metod
    public void addItem(final String item) {
        // item = "yangi element"; // kompilatsiya xatosi: final o'zgaruvchiga tayinlash mumkin emas
        items.add(item);
    }
}

// final klass
// public final class ImmutableClass {
//     private final int value;
//
//     public ImmutableClass(int value) {
//         this.value = value;
//     }
//
//     public int getValue() {
//         return value;
//     }
// }

// public class SubclassOfImmutable extends ImmutableClass { // kompilatsiya xatosi: final klassdan meros olish mumkin emas
// }
```}}}}}