On Tue, 29 Dec 2020 10:42:18 GMT, Peter Levart <plev...@openjdk.org> wrote:

>> Hi,
>> Sorry for joining late to this discussion, but I think that changing this 
>> method to delegate to c.addAll(Arrays.asList(...)) might not be the best 
>> thing to do here. Why?
>> - This might look as a convenience method, but it takes only 2 characters 
>> less to type Collections.addAll(c, ...) than it takes to type 
>> c.addAll(Arrays.asList(...)), so we would basically end up with two ways of 
>> performing the same thing. I think we can make a method that would be worth 
>> more than that.
>> - Pursuing performance is a noble goal, but performance is not everything. 
>> Predictability and guarantees are also important. The convenience method, 
>> being varargs method, can also be invoked with an array in place of varargs 
>> argument. Current implementation is trusted (part of JDK) and guarantees to 
>> never modify the passed-in array argument. If this was modified to just 
>> delegate to Collection.addAll(Arrays.asList(array)), it depends on the 
>> concrete implementation of the .addAll method of the implementation class of 
>> the collection. Misbehaving collection implementation could modify the 
>> passed-in Arrays.asList and such modifications would propagate to the array.
>> 
>> So I would preferably do one of two things here. Either change the javadoc 
>> to describe current behaviour better, or use some other immutable List 
>> wrapper different than Arrays.asList() which is mutable. WDYT?
>
> Hint: you could use 
> `java.util.ImmutableCollections#listFromTrustedArrayNullsAllowed` if only 
> this method would allow other types of arrays, not just Object[]... I really 
> don't know why this restriction couldn't be lifted as the captured array is 
> fully encapsulated.

On a second thought, using 
`java.util.ImmutableCollections#listFromTrustedArrayNullsAllowed` is not a good 
idea, since the method expects the passed-in array to be trusted and use of 
this method in `Collections.addAll(col, array)` would wrap an untrusted array. 
Surely the resulting List would only be used as an argument to 
`col.addAll(list)`, but since neither `col` is trusted, it could "steal" the 
passed-in `list` and use it...
Some other implementation of immutable list array wrapper would be needed here.

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

PR: https://git.openjdk.java.net/jdk/pull/1764

Reply via email to