On 3/12/19 4:32 PM, Ivan Gerasimov wrote:
If there were two new subtypes of Iterable introduced:  IterableOnce and IterableMultipleTimes, then all existing Iterables could be retrofitted to implement one of these.

It wouldn't *automatically* solve the problem of 3rd party API, which accepts an Iterable and iterates it multiple times, but would provide a means to change that API in a straightforward way.

Also, the static analysis tools could issue a suggestion for code that iterates Iterable more than once to switch to IterableMultipleTimes, so that it won't be possible to pass in an IterableOnce.

It would also allow to strengthen the specification for IterableMultipleTimes and state that all classes implementing it must make it possible to obtain multiple iterators.

Hi Ivan,

This would be a cleaner type hierarchy, in the sense that it would avoid the subtype-or-supertype issue that's being discussed in a parallel segment of this thread. But practically speaking I don't think it adds much value. Most Iterables can be iterated multiple times; it seems to be the exceptional case that an Iterable is once-only. (In the JDK, the examples of Scanner and Stream show that things with once-only behavior avoided implementing Iterable at all.) While we could migrate the JDK classes to IterableMany (or whatever it would be called), I think it's unrealistic to expect that all the Iterable implementations out there in the wild would migrate. We'd thus be left with Iterable and IterableMany meaning more-or-less the same thing in perpetuity.

By introducing IterableOnce, we can attract retrofits by once-off things (like Scanner and Streams) and the uncommon occurrences of once-off things like DirectoryStream that currently implement Iterable can be migrated to IterableOnce. Everybody else can then just stay on Iterable.

s'marks

Reply via email to