Sobes.tech
Middle

Nima uchun dasturlashda immutability juda muhim?

sobes.tech AI

AIdan javob

O'zgarmaslik bir qator afzalliklarni ta'minlaydi:

  • Ko'p ipli muhitda xavfsizlik: O'zgarmas obyektlar xavfsiz tarzda iplar o'rtasida bo'lishi mumkin, sinxronizatsiya yoki blokirovkalar talab qilinmaydi, bu ko'p ipli ilovalarni ishlab chiqishni soddalashtiradi va ma'lumotlar urushlarini oldini oladi.
  • Oldindan aytib bo'ladiganlik: O'zgarmas obyektning holati uning yaratilgandan keyin hech qachon o'zgarmaydi. Bu dasturdagi ma'lumot oqimini tushunishni va xatolarni aniqlashni osonlashtiradi, chunki siz aniq bilasizki, obyekt kutilmagan tarzda o'zgarmaydi.
  • Kesh va memorization: O'zgarmas obyektlar oson keshga olinadi. Agar ikki obyekt teng bo'lsa (equals), ularning hash kodlari har doim bir xil bo'ladi (to'g'ri hashCode amalga oshirilgan bo'lsa), va ularning holati o'zgarmaydi, bu hisoblangan natijalarni xavfsiz tarzda qayta ishlatishga imkon beradi.
  • Dizaynni soddalashtirish: O'zgarmas obyektlar bilan dizayn ko'proq modulli va tushunarli kodga olib kelishi mumkin. O'zgarmas obyektlarni qabul qiladigan va qaytaradigan funksiyalar toza va kirish ma'lumotlariga ta'sir qilmaydi.
  • Ba'zi hollarda ishlash tezligini oshirish: Har bir o'zgarishda yangi obyekt yaratish samarali bo'lmasligi mumkin, ammo JVM ning garbage collector'i ko'p qisqa umrli obyektlar bilan ishlash uchun optimallashtirilgan va blokirovkalar yo'qligi ko'p ipli muhitda xarajatlarni qoplash mumkin.

O'zgarmas sinf yaratish misoli:

public final class ImmutableClass {

    private final int value;
    private final String name;

    public ImmutableClass(int value, String name) {
        this.value = value;
        this.name = name;
    }

    public int getValue() {
        return value;
    }

    public String getName() {
        return name;
    }

    // Setters yo'q
    // Final maydonlar
    // Final sinf
    // Barcha maydonlar primitiv yoki o'zgarmas obyektlar,
    // yoki kerak bo'lsa, o'zgartiriladigan obyektlarning nusxalarini qaytaradi (bu yerda yo'q)

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ImmutableClass that = (ImmutableClass) o;
        if (value != that.value) return false;
        return name != null ? name.equals(that.name) : that.name == null;
    }

    @Override
    public int hashCode() {
        int result = value;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}