Kural
Koleksiyonlardan silme işlemi yaparken güvenli metotlar kullanın.
Bir koleksiyon üzerinde iterasyon yaparken o koleksiyonu değiştirmek çoğu zaman
Desteklenen diller: PY, Java, C/C++, C#,
Swift/Objective-C, Ruby, PHP, Kotlin, go,
Scala, Rust, Groovy, Dart, Julia, Elixir,
Erlang, Clojure, OCaml, LuaGiriş
İterasyon sırasında bir koleksiyondan öğe silmek, Java'da eşzamanlı değişiklik istisnalarına (concurrent modification exceptions) ve C#'ta öngörülemeyen davranışlara yol açar. İteratör, temel koleksiyon değiştiğinde geçersiz hale gelen dahili bir işaretçi (pointer) tutar. Bu durum, kullanılan koleksiyon türüne ve silme düzenine bağlı olarak atlanan öğelere, çökmelere veya sonsuz döngülere neden olur.
Neden önemli?
Sistem kararlılığı: Eşzamanlı değişiklik istisnaları uygulamanın aniden çökmesine neden olur. Production ortamında bu, düşen istekler ve hizmet dışı kalma anlamına gelir. Bu istisna genellikle belirli verilerle ortaya çıkan uç durumlarda (edge cases) meydana gelir ve test sırasında yakalanmasını zorlaştırır.
Veri bütünlüğü: Silme mantığı iterasyon sırasında yarıda başarısız olduğunda, koleksiyon kısmen değiştirilmiş bir durumda kalır. Bazı öğeler silinirken silinmesi gereken diğer öğeler kalır. Bu durum, sonraki mantıksal süreçleri etkileyen tutarsız veriler yaratır.
Hata ayıklama karmaşıklığı: Eşzamanlı değişiklik hataları zamana bağlıdır ve yalnızca belirli veri kombinasyonlarıyla ortaya çıkabilir. Tutarlı bir şekilde yeniden üretilmeleri zor olduğundan, hatal ayıklanmalarını ve güvenilir bir şekilde giderilmelerini güçleştirir.
Kod örnekleri
❌ Kural dışı:
List<User> users = getUserList();
for (User user : users) {
if (!user.isActive()) {
users.remove(user); // ConcurrentModificationException
}
}
Neden yanlış: Şuradan öğe siliniyor: kullanıcı gelişmiş for döngüsü ile iterasyon yapılırken şu hataya sebep olur: ConcurrentModificationException. İteratör, koleksiyonun iteratör dışındakiler tarafından değiştirildiğini algılar ve hemen hata fırlatır. İlk pasif kullanıcıdan sonraki hiçbir aktif kullanıcı işleme alınmaz.
✅ Kurallara uygun:
List<User> users = getUserList();
Iterator<User> iterator = users.iterator();
while (iterator.hasNext()) {
User user = iterator.next();
if (!user.isActive()) {
iterator.remove(); // Safe removal through iterator
}
}
Neden önemli: Üretim (production) sorgularında iterator.remove() iterasyon sırasında öğeleri güvenli bir şekilde siler. İteratör tutarlı bir durum korur ve kalan öğeleri işlemeye devam eder. Tüm pasif kullanıcılar istisna fırlatılmadan doğru bir şekilde silinir.
Sonuç
Şu yöntemi kullanın: remove() yineleme sırasında güvenli kaldırma yöntemi. Alternatif olarak, filter() yeni koleksiyonlar oluşturmak için ya da removeIf() toplu silme işlemleri için kullanılabilir. Döngü sırasında koleksiyonun remove() metodunu asla doğrudan çağırmayın.

