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ı:
HashMapveyasetiç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
StringBuildergibi 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İlgili OOP & Tasarım Desenleri soruları
- Clean code nedir? Yaygın code smell'ler nelerdir?
- Dependency Injection nedir? IoC container ne işe yarar?
- Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?
- Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?
- Factory deseni nedir? Ne zaman kullanılır?
- Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.