Sobes.tech
Middle

Proqramlaşdırmada niyə dəyişməzlik bu qədər vacibdir?

sobes.tech Süni İntellekt

AI-dan cavab

Dəyişməzlik bir sıra üstünlüklər təmin edir:

  • Çox ipli mühitdə təhlükəsizlik: Dəyişməz obyektlər, sinxronizasiya və ya kilid tələb etmədən təhlükəsiz şəkildə iplar arasında paylaşa bilər, bu da çox ipli tətbiqlərin inkişafını sadələşdirir və yarış şəraitlərinin qarşısını alır.
  • Əvvəlcədən bilmək: Dəyişməz obyektin vəziyyəti onun yaradılmasından sonra heç vaxt dəyişmir. Bu, proqramdakı məlumat axınını anlamağı və səhvləri tapmağı asanlaşdırır, çünki obyektin gözlənilmədən dəyişməyəcəyini tam bilirsiniz.
  • Keş və yaddaşda saxlama: Dəyişməz obyektlər asanlıqla keşdə saxlana bilər. Əgər iki obyekt bərabərdirsə (equals), onların hash kodları həmişə eyni olacaq (doğru hashCode tətbiqi şərti ilə), və onların vəziyyəti dəyişməz, bu da hesablanmış nəticələrin təhlükəsiz şəkildə yenidən istifadə olunmasına imkan verir.
  • Tasarımın sadələşdirilməsi: Dəyişməz obyektlərlə dizayn daha modulyar və anlaşılan kodlara gətirib çıxara bilər. Dəyişməz obyektləri qəbul edən və geri qaytaran funksiyalar safdır və giriş məlumatlarına yan təsir göstərmir.
  • Bəzi hallarda performansın yaxşılaşdırılması: Hər dəyişiklikdə yeni obyekt yaratmaq qeyri-effektiv görünə bilər, amma JVM-in çöp toplayıcısı çox sayda qısa ömürlü obyektlə işləmək üçün optimallaşdırılıb və çox ipli mühitdə kilidlərin olmaması xərcləri kompensasiya edə bilər.

Dəyişməz sinifin nümunəsi:

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;
    }

    // Setter yoxdur
    // Final sahələr
    // Final sinif
    // Bütün sahələr primitiv və ya dəyişməz obyektlərdir,
    // və ya lazım olduqda dəyişməz obyektlərin nüsxələrini qaytarır (burada yoxdur)

    @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;
    }
}