Kural
Kullanım güvenli yöntemleri kullan çıkarırken koleksiyonlardan koleksiyonlardan
Değiştirme bir koleksiyonu döngü bir sırasındaki üzerinde genellikle hatalara hatalara yol açar.
Desteklenen diller: PY, Java, C/C++, C#,
Swift/Objective-C, Ruby, PHP, Kotlin, Go,
Scala, Rust, Groovy, Dart, Julia, Elixit,
Erlang, Clojure, OCaml, LuaGiriş
Bir koleksiyondan yineleme sırasında öğelerin kaldırılması, Java'da eşzamanlı değiştirme istisnalarına ve C#'da öngörülemeyen davranışlara neden olur. Yineleyici, altta yatan koleksiyon değiştiğinde geçersiz hale gelen dahili bir işaretçiye sahiptir. Bu durum, koleksiyon türüne ve kullanılan kaldırma yöntemine bağlı olarak öğelerin atlanmasına, programın çökmesine veya sonsuz döngülere yol açar.
Neden önemli?
Sistem kararlılığı: Eşzamanlı değişiklik istisnaları, uygulamanın anında çökmesine neden olur. Üretim ortamında bu durum, isteklerin kaybolması ve hizmetin kullanılamaması anlamına gelir. Bu istisna genellikle belirli verilerle ilgili sınır durumlarında ortaya çıktığı için, test aşamasında tespit edilmesi zordur.
Veri bütünlüğü: İterasyonun ortasında silme işlemi başarısız olduğunda, koleksiyon kısmen değiştirilmiş bir durumda kalır. Bazı öğeler silinirken, silinmesi gereken diğer öğeler ise kalır. Bu durum, sonraki aşamalardaki işlemleri etkileyen tutarsız verilere yol açar.
Hata ayıklama karmaşıklığı: Eşzamanlı değiştirme hataları zamanlamaya bağlıdır ve yalnızca belirli veri kombinasyonlarında ortaya çıkabilir. Bu hataları tutarlı bir şekilde yeniden oluşturmak zordur; bu da hata ayıklama ve güvenilir bir şekilde düzeltme işlemlerini zorlaştırır.
Kod örnekleri
❌ Uygun değil:
List<User> users = getUserList();
for (User user : users) {
if (!user.isActive()) {
users.remove(user); // ConcurrentModificationException
}
}
Neden yanlış: Şuradan kaldırma kullanıcılar Geliştirilmiş for döngüsüyle yineleme yaparken ortaya çıkan sorunlar ConcurrentModificationException. İteratör, koleksiyonun iteratörün dışında değiştirildiğini algılar ve derhal hata atar. İlk etkin olmayan kullanıcıdan sonraki tüm aktif kullanıcılar hiçbir zaman işleme alınmaz.
✅ Uygunluk:
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
}
}
Bunun önemi: Kullanım iterator.remove() Yineleme sırasında öğeleri güvenli bir şekilde kaldırır. Yineleyici, tutarlı bir durum sağlar ve kalan öğeleri işlemeye devam eder. Etkin olmayan tüm kullanıcılar, istisna oluşmadan doğru bir şekilde kaldırılır.
Sonuç
İteratörleri kullanın remove() iterasyon sırasında güvenli bir şekilde kaldırma yöntemi. Alternatif olarak, şu özelliklere sahip akışları kullanın: filter() yeni koleksiyonlar oluşturmak veya removeIf() büyük hacimli atıkların toplanması için. Asla çöp toplama hizmetini aramayın remove() döngü sırasında doğrudan.

