On Wed, 29 Mar 2023 21:18:02 GMT, Chen Liang <li...@openjdk.org> wrote:

>> Stuart Marks has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Simplify handling of cached keySet, values, and entrySet views.
>
> In the JEP:
>> A sequenced collection supports common operations at either end, and it 
>> supports processing the elements from first to last and from last to first 
>> (i.e., forward and reverse).
> 
>> The reverse-ordered view enables all the different sequenced types to 
>> process elements in both directions, using all the usual iteration 
>> mechanisms: Enhanced for loops, explicit iterator() loops, forEach(), 
>> stream(), parallelStream(), and toArray().
> 
> This implies that for the reversed view, collection operations are not only 
> supported, but can potentially be optimized. Our design should anticipate 
> implementations of `SequencedCollection` to provide specific reversed 
> implementations, like what we are already doing with `addAll` in ArrayList 
> and ArrayDeque. If a collection cannot have efficient reverse-sequenced 
> operations, it shouldn't be retrofitted into `SequencedCollection`, just like 
> how we don't fit Deques into Lists.
> 
> Hence, I recommend:
> 1. Declare `reversed()` and one of the (First/Last) operation sets 
> (add|get|remove) `abstract`, and delegae the other set to default call the 
> operation on the reversed instead. 
>    - Since we tend to work with the end of collections, I'd declare the 
> `Last` methods to be abstract and delegate the `First` default 
> implementations to `this.reversed().xxxLast()`
> 2. I don't think leaving `addLast()` implemented by default is a good idea, 
> for modifiable implementations cannot discover that they missed the 
> `addLast()` at compile time and can only discover when the implementation is 
> actually used.
> 3. In the default `reversed()` implementation of `List` and `Deque`, add API 
> notes to indicate to implementations opportunities to optimize the 
> implementation, especially batch operations like `addAll` when the base 
> implementation offers such an optimization.

> @liach
> 
> I understand that you're suggesting adding various default implementations in 
> order to make it easier for people to bring up implementations of 
> SequencedCollections. However, adding default implementations to 
> SequencedCollection itself is unlikely to help. I expect that most 
> implementations will override both addFirst and addLast. Requiring overriding 
> of only one of them will hardly help anything, because the more difficult 
> task is implementing the reverse-ordered view. I'd prefer to concentrate on 
> some kind of implementation assistance for doing that. For example, there 
> could be an "AbstractSequencedCollection" that would require overriding only 
> a couple methods, rather like `AbstractCollection`. I'm a bit reluctant to 
> introduce new abstract classes into the public API though. An alternative 
> might be to have some kind of static factory method that takes something like 
> a Collection and a reverse iterator and returns a SequencedCollection.
> 
> It's not clear to me that such support is necessary. It's pretty easy to 
> bring up a List using AbstractList, and a List is a SequencedCollection. But 
> if we do add something, it should be driven by use cases, and not speculation.

Then shouldn't we leave all methods in SewuencedCollection abstract as users 
almost always override them?

-------------

PR Comment: https://git.openjdk.org/jdk/pull/7387#issuecomment-1490144021

Reply via email to