please review draft JEP: Convenience Factory Methods for Collections
Stuart Marks
stuart.marks at oracle.com
Fri Jul 18 23:36:35 UTC 2014
On 7/18/14 2:17 AM, Michael Kay wrote:
> On 18 Jul 2014, at 10:09, Wang Weijun <weijun.wang at oracle.com> wrote:
>> A .with(k, v) to create a new immutable map with an extra pair.
>
> Yes, that's the same as my A.add(k,v) -> A proposal.
>
> Works whether A is mutable or immutable.
I don't think we want to have a Map.add(k,v) instance method (or default method)
for immutable maps or for constructing them.
For a fast, compact, immutable map implementation, the only way to implement
Map.add() would be to copy the entire contents plus the additional pair into a
new map. For creating maps with small numbers of entries, this isn't really a
big deal, but if you have something like
Map.of()
.add(k0, v0)
.add(k1, v1)
...
.add(kN, vN);
this would result in O(N^2) performance and space allocation, though most of the
allocated space is garbage.
Of course, one could avoid the copying overhead by making the immutable maps
persistent (i.e., sharing their unmodified portions) but that is an entirely
different discussion.
I kind of think you're after the ability to chain the method calls. This is
certainly convenient and has no arbitrary restrictions on the number of
elements. To do something like this we'd put the chainable methods on a builder
instead:
Map.builder()
.add(k0, v0)
.add(k1, v1)
...
.add(kN, vN)
.build();
This is somewhat more cluttered than the Map.of(Entry...) approach:
Map.of(
entry(k0, v0),
entry(k1, v1),
...
entry(kN, vN));
but it might make up for it with flexibility. I hesitate a bit to pursue the
builder approach, because it can easily get bogged down with additional
features, but the special considerations for Map might require it.
s'marks
More information about the core-libs-dev
mailing list