Altri hanno menzionato il punto valido che normalmente questo non è il modo per remove
un oggetto da un collezione. TUTTAVIA, in questo caso va bene dal momento che si è break
fuori dal ciclo una volta che si remove
.
Se si desidera continuare a ripetere dopo un remove
, è necessario utilizzare un iteratore. Altrimenti riceverai un ConcurrentModificationException
o, nel caso più generale, un comportamento non definito.
Quindi sì, se break
fuori dal foreach
dopo aver remove
, andrà tutto bene.
A chi sta dicendo che questo non riuscirà perché non è possibile modificare una raccolta in un foreach
- questo è vero solo se si desidera mantenere l'iterazione. Non è questo il caso, quindi questa scorciatoia va bene.
A ConcurrentModificationException
viene controllato e generato dall'iteratore. Qui, dopo lo remove
(che si qualifica come modifica simultanea), si esce dal ciclo break
. L'iteratore non ha nemmeno la possibilità di rilevarlo.
Può essere meglio se si aggiunge un commento sul break
, perché è assolutamente necessario, ecc, perché se questo codice viene poi modificato a continuare l'iterazione dopo un remove
, fallirà.
vorrei trattare questo idioma simile a goto
(o meglio, l'etichetta break
/continue
): può sembrare sbagliato in un primo momento, ma quando viene utilizzato con saggezza, si fa per un codice più pulito.
Non ho controllato le specifiche della lingua, ma la sintassi di foreach non è solo la magia del compilatore che usa un iteratore dietro le quinte? – Powerlord
Sì, utilizza un iteratore dietro la scena e quell'iteratore è nascosto da te. – polygenelubricants
Ma è molto probabile che fallisca nella versione futura, quando lo sviluppatore nexte cerca di aggiungere alcune funzionalità senza "vedere" quel trabocchetto. Dovresti documentarlo chiaramente allora. – whiskeysierra