Middle
Programlamada neden bu kadar önemli olan immutability?
sobes.tech yapay zeka
AI'dan gelen yanıt
Değiştirilemezlik bir dizi avantaj sağlar:
- Çok iş parçacıklı ortamda güvenlik: Değiştirilemez nesneler, senkronizasyon veya kilit olmadan güvenli bir şekilde iş parçacıkları arasında paylaşılabilir, bu da çok iş parçacıklı uygulamaların geliştirilmesini basitleştirir ve yarış koşullarını önler.
- Öngörülebilirlik: Değiştirilemez bir nesnenin durumu, oluşturulduktan sonra asla değişmez. Bu, programdaki veri akışını anlamayı ve hata ayıklamayı kolaylaştırır, çünkü nesnenin beklenmedik şekilde değişmeyeceğini tam olarak bilirsiniz.
- Önbellekleme ve hafıza tutma: Değiştirilemez nesneler önbelleğe alınması kolaydır. İki nesne eşitse (
equals), hash kodları her zaman aynıdır (doğruhashCodeuygulaması varsayılarak), ve durumu değişmez, bu da hesaplanan sonuçların güvenli bir şekilde yeniden kullanılmasını sağlar. - Tasarımın basitleştirilmesi: Değiştirilemez nesnelerle tasarım, daha modüler ve anlaşılır kodlara yol açabilir. Değiştirilemez nesneleri kabul eden ve döndüren fonksiyonlar saf ve giriş verileri üzerinde yan etkisi olmayan fonksiyonlardır.
- Bazı durumlarda performans artışı: Her değişiklikte yeni nesne oluşturmak verimsiz görünebilir, ancak JVM çöp toplayıcısı, kısa ömürlü çok sayıda nesneyle çalışmak üzere optimize edilmiştir ve çok iş parçacıklı ortamda kilitlerin olmaması maliyetleri telafi edebilir.
Değiştirilemez bir sınıf örneği:
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 yok
// final alanlar
// final sınıf
// Tüm alanlar ilkel veya değiştirilemez nesneler,
// veya gerekirse değiştirilebilir nesnelerin kopyalarını döndürür (burada yok)
@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;
}
}