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ğruhashCodetə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;
}
}