RFR: JDK-8134373: explore potential uses of convenience factories within the JDK

Stuart Marks stuart.marks at oracle.com
Thu Sep 15 17:20:07 UTC 2016


Hi all,

Unfortunately I don't have time to work on any of this at the moment, because of 
JavaOne preparation, and JavaOne next week.

Jonathan, thanks for pushing forward with this. I'm glad that others have picked 
it up.

Patrick, thanks for posting the changeset on Jonathan's behalf. This is very 
helpful.

A few comments regarding issues raised up-thread.

Regarding the (non)singleton-ness of the empty collections, this is covered by

     https://bugs.openjdk.java.net/browse/JDK-8156079
     consider making empty instances singletons

It wasn't a design decision to make them not singletons. The spec requirement is 
only that the returned instance satisfy the requirements of the interfaces it 
implements (e.g., List) and nothing more. Certainly there is no spec requirement 
regarding object identity.

Making the empty collections singletons is the "obvious" thing to do, but it's 
often the case that the "obvious" thing isn't the right thing. That said, it may 
still be the right thing to make them singletons. Given the proposed extension 
to the JDK 9 schedule, it might be possible to change this in JDK 9.

Note that List.of() should be functionally equivalent to Collections.emptyList() 
-- and correspondingly for Set and Map -- but they do differ. In particular, 
they have different serialization formats.

Also on this topic, please note comments that Daniel Fuchs and I have added to

     https://bugs.openjdk.java.net/browse/JDK-8134373

regarding serialization compatibility. Reviewers should take care that updating 
code to use these new collection factories doesn't change any serialization 
formats. Unfortunately I am not confident that we have sufficient tests for 
serialization compatibility.

s'marks


On 9/15/16 7:02 AM, Jonathan Bluett-Duncan wrote:
> Wow, lots of discussion went on since I was busy doing other stuff!
>
> Thanks Patrick for doing the work of creating a new webrev for me. Really
> appreciated!
>
> Pavel already mentioned it, but I think List.of instead of
> Collections.emptyList in ZoneOffsetTransition is the right thing to do for
> visual and behavioural consistency. If it turns out that we need to revert
> to Collections.empty* and Collections.unmodifiable* for e.g.
> serializability or class loading concerns, then I'd be happy to revert both
> of the lines I touched. Otherwise I believe that List.of should be used
> consistently.
>
> I think Stuart made List.of() non-singleton because there wasn't any
> evidence that it made List.of() more memory- or time-intensive than
> Collections.emptyList(), but I might be wrong on this. I'm sure he can
> explain more or correct me in this case.
>
> Kind regards,
> Jonathan
>
>
> On 15 September 2016 at 13:33, Patrick Reinhart <patrick at reini.net> wrote:
>
>> Hello together,
>>
>> I tried to process all suggested change input into the following new
>> webrev:
>>
>> http://cr.openjdk.java.net/~reinhapa/reviews/8134373/webrev.01
>>
>> Give me feedback if something is missing/wrong
>>
>> -Patrick
>>
>>
>> On 2016-09-15 13:48, Pavel Rappo wrote:
>>
>>> Daniel, Claes,
>>>
>>> List.of() and Collections.emptyList() are not the same. The behaviours are
>>> different. Moreover, immutable static factory methods return instances
>>> which are
>>> value-based. I believe it also means we are not tied with unconditional
>>> instantiation, and in case of empty collections/maps could probably
>>> return the
>>> same object every time.
>>>
>>> We should ask Stuart why it has been done like that in the first place.
>>> Maybe
>>> out of concern people might synchronize of those objects? I don't know.
>>> Let's
>>> say for now it's an implementation-specific detail.
>>>
>>> On 15 Sep 2016, at 12:35, Claes Redestad <claes.redestad at oracle.com>
>>>> wrote:
>>>>
>>>> +1
>>>>
>>>> I don't mind List.of() aesthetically, but there are places where
>>>> startup/footprint is important where Collections.emptyList()
>>>> is simply superior, e.g., constituting permanent data structures
>>>> such as the module graph during early bootstrap.
>>>>
>>>>


More information about the core-libs-dev mailing list