In C#, l'interfaccia IEnumerator definisce un modo per attraversare una raccolta e osservare gli elementi. Penso che questo sia tremendamente utile perché se si passa a IEnumerable<T>
a un metodo, non si modifica la fonte originale.Perché Iterator definisce l'operazione remove()?
Tuttavia, in Java, Iterator definisce l'operazione remove su (facoltativamente!) Consentire l'eliminazione di elementi. Non vi è alcun vantaggio nel passare Iterable<T>
a un metodo poiché tale metodo può ancora modificare la raccolta originale.
remove
s' optionalness è un esempio del refused bequest odore, ma ignorando che (già discusso here) Sarei interessato alle decisioni di progettazione che hanno indotto un evento remove
da attuare sull'interfaccia.
Quali sono le decisioni di progettazione che hanno portato a remove
aggiunto a Iterator
?
Per mettere un altro modo, qual è la decisione di progettazione C# che non ha esplicitamente remove
definito su IEnumerator
?
'unmodifiableXYZ' è solo una cosa runtime però, mi piacciono gli invarianti statici. Ero più interessato alla decisione di progettazione che ha portato alla rimozione di 'remove' e forse perché C# non ha scelto troppo. –
La cosa peggiore da usare 'non modificabileXYZ' è che se qualcuno ha passato un' XYZ' già avvolto, puoi avvolgerlo due volte, e non hai modo di evitarlo a meno che non usi la reflection per risolverlo. Anche se ritengo che l'implementazione possa ottimizzarlo, mi sembra ancora troppo brutto. –
Considerata l'implementazione di OpenJDK, sembra che non eviti il wrapping multiplo. Ciò significa che in un'applicazione complicata potresti finalmente completare un semplice 'ArrayList' per 100 o più volte. –