otros han mencionado el punto válido que normalmente esto no es la forma de remove
un objeto de una colección. SIN EMBARGO, en este caso está bien desde break
fuera del circuito una vez que remove
.
Si desea seguir iterando después de remove
, necesita utilizar un iterador. De lo contrario, obtendrá un ConcurrentModificationException
o, en el caso más general, un comportamiento indefinido.
Así que sí, si break
fuera de la foreach
después remove
, se le multa.
A los que está diciendo que esto se producirá un error porque no se puede modificar una colección en un foreach
- esto es cierto sólo si desea mantener la iteración. Ese no es el caso aquí, por lo que este atajo está bien.
A ConcurrentModificationException
es revisado y arrojado por el iterador. Aquí, después del remove
(que califica como modificación simultánea), break
fuera del ciclo. El iterador ni siquiera tiene la oportunidad de detectarlo.
Puede ser mejor si se añade un comentario en la break
, por eso que es absolutamente necesario, etc, porque si este código se modificó más tarde para continuar la iteración después de un remove
, fallará.
yo trataría este lenguaje similar a goto
(o más bien, la etiqueta break
/continue
): puede parecer mal al principio, pero cuando se usa con prudencia, que lo convierte en un código más limpio.
No he comprobado la especificación del idioma, pero ¿no es la sintaxis foreach simplemente la magia del compilador que usa un iterador detrás de las escenas? – Powerlord
Sí, utiliza un iterador detrás de la escena y ese iterador está oculto para usted. – polygenelubricants
Pero es muy probable que falle en la versión futura, cuando el desarrollador de nexte intenta agregar alguna funcionalidad sin "ver" esa trampa. Debes documentarlo claramente entonces. – whiskeysierra