Regra
Utilização métodos métodos ao remover de coleções.
Modificar uma coleção enquanto a sobre ela frequentemente causa erros.
Idiomas suportados: PY, Java, C/C++, C#,
Swift/Objective-C, Ruby, PHP, Kotlin, go,
Scala, Rust, Groovy, Dart, Julia, Elixit,
Erlang, Clojure, OCaml, LuaIntrodução
Remover itens de uma coleção durante a iteração causa exceções de modificação concorrente em Java e comportamento imprevisível em C#. O iterador mantém um ponteiro interno que se torna inválido quando a coleção subjacente é alterada. Isso leva a elementos ignorados, falhas ou loops infinitos, dependendo do tipo de coleção e do padrão de remoção utilizados.
Por que isso importa
Estabilidade do sistema: Exceções de modificação concorrente travam a aplicação imediatamente. Em produção, isso significa requisições perdidas e indisponibilidade do serviço. A exceção frequentemente ocorre em casos de borda com dados específicos, tornando-a difícil de detectar durante os testes.
Integridade dos dados: Quando a lógica de remoção falha no meio de uma iteração, a coleção é deixada em um estado parcialmente modificado. Alguns itens são removidos enquanto outros que deveriam ter sido removidos permanecem. Isso cria dados inconsistentes que afetam a lógica a jusante.
Complexidade de depuração: Bugs de modificação concorrente dependem de tempo e podem se manifestar apenas com certas combinações de dados. São difíceis de reproduzir consistentemente, tornando-os complexos de depurar e corrigir de forma confiável.
Exemplos de código
❌ Não-conforme:
List<User> users = getUserList();
for (User user : users) {
if (!user.isActive()) {
users.remove(user); // ConcurrentModificationException
}
}
Por que está errado: Removendo de usuários enquanto a iteração com for-loop aprimorado causa ConcurrentModificationException. O iterador detecta que a coleção foi modificada fora do iterador e lança uma exceção imediatamente. Quaisquer usuários ativos após o primeiro inativo nunca são processados.
✅ Compatível:
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
}
}
Por que isso importa: Utilizando iterator.remove() remove itens com segurança durante a iteração. O iterador mantém um estado consistente e continua processando os itens restantes. Todos os usuários inativos são removidos corretamente, sem exceções.
Conclusão
Utilize iteradores remove() método para remoção segura durante a iteração. Alternativamente, use streams com filter() para criar novas coleções ou removeIf() para remoção em massa. Nunca chame a coleção de remove() diretamente durante a iteração.
.avif)
