In C# definiert die Schnittstelle IEnumerator eine Möglichkeit, eine Sammlung zu durchlaufen und sich die Elemente anzusehen. Ich denke, das ist enorm nützlich, denn wenn Sie IEnumerable<T>
an eine Methode übergeben, wird es nicht die ursprüngliche Quelle ändern.Warum definiert Iterator die Operation remove()?
In Java, Iterator definiert jedoch die remove Operation (optional!) Ermöglichen das Löschen von Elementen. Es hat keinen Vorteil, Iterable<T>
an eine Methode zu übergeben, da diese Methode die ursprüngliche Sammlung noch ändern kann.
remove
‚s optionalness ist ein Beispiel für die refused bequest Geruch, aber ignorieren, dass (bereits here diskutiert) ich in den Design-Entscheidungen interessiert sein würde, die eine remove
Ereignis aufgefordert, an der Schnittstelle implementiert werden.
Welche Designentscheidungen führten dazu, dass remove
zu Iterator
hinzugefügt wurde?
Anders gesagt, was ist die C# -Entwurfsentscheidung, die remove
explizit nicht definiert ist, auf IEnumerator
?
'unmodifizierbarXYZ' ist nur eine Laufzeit Sache, ich mag statische Invarianten. Ich war mehr an der Designentscheidung interessiert, die dazu führte, dass 'remove' hinzugefügt wurde und vielleicht, warum C# auch nicht wählte. –
Die schlimmste Sache, 'unmodiableXYZ' zu verwenden, ist, dass wenn jemand eine XYZ-Datei übergeben hat, die bereits verpackt ist, können Sie sie zweimal umbrechen, und Sie haben keine Möglichkeit, sie zu vermeiden, es sei denn, Sie verwenden Reflektion. Obwohl ich der Meinung bin, dass die Implementierung dies optimieren würde, sieht es für mich immer noch zu schlecht aus. –
Mit Blick auf die OpenJDK-Implementierung scheint es kein mehrfaches Wrapping zu vermeiden. Das bedeutet, dass Sie in einer komplizierten Anwendung eine einfache 'ArrayList' für 100 Mal oder mehr verpacken können. –