Immutability (değişmezlik) nedir? Immutable nesnelerin avantajları ve maliyetleri nelerdir?

Cevap

Immutable bir nesnenin durumu oluşturulduktan sonra değiştirilemez; "değişiklik" gerektiğinde yeni bir nesne üretilir. Java'da String, Python'da tuple ve frozenset, Kotlin'de val + data class copy() bilinen örneklerdir.

Avantajları

  • Thread safety: paylaşılan durum değişmediği için kilit (lock) gerekmez; race condition riski ortadan kalkar.
  • Öngörülebilirlik: bir nesneyi bir fonksiyona verdiğinizde gizlice değiştirilmeyeceğinden emin olursunuz.
  • Güvenli hash anahtarı: HashMap veya set içine konan nesnenin hash'i değişmez.
  • Kolay cache ve paylaşım: aynı nesne birçok yerde güvenle kullanılabilir.
  • React/Redux gibi UI dünyasında referans karşılaştırmasıyla (prev !== next) değişiklik tespiti.

Maliyetleri

  • Her değişiklikte yeni nesne: sık güncellenen büyük yapılarda bellek ve GC baskısı.
  • Çözüm: persistent data structure'lar (structural sharing), ör. Clojure koleksiyonları, Immutable.js; veya yoğun döngülerde StringBuilder gibi geçici mutable yapılar.

Java'da immutable sınıf kuralları

public final class Money {                 // 1) alt sınıf açılmasın
    private final BigDecimal amount;       // 2) tüm alanlar private final
    private final String currency;
    private final List<String> tags;

    public Money(BigDecimal amount, String currency, List<String> tags) {
        this.amount = amount;
        this.currency = currency;
        this.tags = List.copyOf(tags);     // 3) mutable girdiyi defensive copy
    }
    public Money add(Money other) {        // 4) setter yok, yeni nesne döner
        return new Money(amount.add(other.amount), currency, tags);
    }
    public List<String> tags() { return tags; }  // List.copyOf zaten değiştirilemez
}

Java 16+ record sınıfları alanları final yapar ama içindeki listeleri derin kopyalamaz; bunu kendiniz yapmalısınız.

Python örneği

from dataclasses import dataclass, replace

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
p2 = replace(p, x=5)    # yeni nesne; p.x = 5 ise FrozenInstanceError verir
  1. Clean code nedir? Yaygın code smell'ler nelerdir?OrtaOOP & Tasarım DesenleriYazılım Müh.
  2. Dependency Injection nedir? IoC container ne işe yarar?ZorOOP & Tasarım DesenleriYazılım Müh.
  3. Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?OrtaOOP & Tasarım DesenleriYazılım Müh.
  4. Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?OrtaOOP & Tasarım DesenleriYazılım Müh.
  5. Factory deseni nedir? Ne zaman kullanılır?OrtaOOP & Tasarım DesenleriYazılım Müh.
  6. Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?ZorOOP & Tasarım DesenleriYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle