8143850: retrofit ArrayDeque to implement List

Peter Levart peter.levart at gmail.com
Sat Aug 4 08:11:40 UTC 2018


Hi all,

On 08/04/2018 01:51 AM, Stuart Marks wrote:
> Thanks, Patrick! This is very helpful.
>
> Alex, others,
>
> (Meta: I've been at JVMLS and the OpenJDK Committers' Workshop all 
> week, and I'm on vacation next week, so I don't have much time to 
> discuss this right now. However, I am interested in moving this forward.)
>
> OK, so the API in this webrev essentially does a combination of the 
> following:
>
> 1. Adds some List methods to ArrayDeque without having it implement 
> List; and
>
> 2. Adds public ArrayDeque.List implementation of List as an AD subclass.
>
> There are a variety of alternative API approaches that I think we 
> should consider. Among them:
>
> 3. Add a List *view* of an ArrayDeque instance, e.g. returned by an 
> asList() method. (I believe Martin has suggested this.)
>
> 4. Add a new top-level List implementation that is a subclass of 
> ArrayDeque, that thus implements both List and Deque interfaces.
>
> 5. Same as 4, a top level class implementing List and Deque, but which 
> contains an ArrayDeque instead of subclassing ArrayDeque.
>
> 6. Modify ArrayDeque to implement List, including changing the 
> behavior of equals() and hashCode().
>
> There are a bunch of tradeoffs among these alternatives that I don't 
> have time to discuss right now, but they deserve discussion. I may 
> also have missed some variations. Among the criteria for evaluation 
> are 1) implementation sharing; 2) API footprint; 3) compatibility. 
> (And also probably others.)
>
> A couple other points:
>
> * I'd like to set aside null support. We've been discouraging nulls in 
> collections for years, so allowing null in a (conceptually) new 
> collection sounds like a step in the wrong direction.
>
> * Using an array sentinel to indicate an empty collection with default 
> size, like ArrayList does, is a fine idea, but I think it complicates 
> the discussion and the webrev. I'd suggest that it be factored out and 
> considered separately.
>
> As I've said previously, the main thing to decide is what we want the 
> API to look like. A discussion of the pros and cons of the various 
> alternatives I listed above (and others I might have missed) is 
> therefore called for. I can discuss these further after I return, but 
> meanwhile, if anyone has any thoughts in the tradeoffs here, please 
> speak up.
>
> Oh, and of course, thanks Alex for putting work into this proposal.
>
> s'marks

I'm wondering if type inheritance here is a desired property. There are 
several past "mistakes" that don't play quite well and we have to live 
with like: Hashtable/Properties, java.util.Date/java.sql.Date | 
java.sql.Time | java.sql.Timestamp.

Creating a subclass of ArrayDeque that implements List might be a 
compatibility risk that is not much smaller than simply adding List 
interface to ArrayDeque itself. Sure if the creation/lifecycle of 
ArrayDeque[.List] instance is contained in the controlled way, the risk 
is minimized, but if the instance escapes across library boundary, it 
doesn't matter if List is implemented by a subclass or the ArrayDeque 
itself. Code using ArrayDeque type might reasonably assume there is a 
single implementation that behaves in the way it always did.

There's an example in existing Java API that allows code re-use but 
doesn't expose type inheritance: package-private AbstractStringBuilder 
with public subclasses StringBuffer and StringBuilder.

This is similar from API standpoint to Stuart's option #5, but might 
allow greater code re-use (less boilerplate as there would be no 
delegation code) and of course would be more space and time efficient.

What do you think?

Regards, Peter

>
>
> On 7/31/18 12:21 PM, Patrick Reinhart wrote:
>> Am 31.07.2018 um 21:10 schrieb Patrick Reinhart:
>>> Hi Alex,
>>>
>>> I can do that for you ....
>>>
>>> -Patrick
>>>
>>
>> Here it is:
>>
>> http://cr.openjdk.java.net/~reinhapa/reviews/8143850/webrev
>>
>> -Patrick
>>



More information about the core-libs-dev mailing list