I also think that the randomization of Set.of(...) and
Map.of(...) is a good property as it uncovers bugs early if one
relies on iteration order. This especially since those methods
are often used in tests where production code would use a proper
HashSet which cannot guarantee iteration order for good reasons.
Exactly here I think the new interfaces are a good addition as it
uncovers such misconceptions. If code relies on insertion order,
providing a Set.of(...) does no longer compile, what is a good thing.
To me, adding SequencedSet.of(...) and SequencedMap.of(...)
sounds like the right approach, with implementations similar to
that of Set.of(...) and Map.of(...). As for megamorphism, I think
the chance of encounter at a call site is similar, as Set12 and
SetN from the Set interface are typically combined with HashMap.
As for a possible SequencedSet12 and SequencedSetN, I think they
would normally be seen with LinkedHashSet.
Best regards, Rafael
Am Fr., 17. Jan. 2025 um 00:36 Uhr schrieb David Alayachew
<davidalayac...@gmail.com>:
I should also add, the documentation went out of their way to
specify that iteration order is unspecified.
Also, I see Rémi's comment, but that's even more unconvincing
to me.
Map.of has an upper limit of 10 entries, and Map.ofEntries
has an upper limit of that Java max file size limit thing.
You all know what I am talking about.
Point is, both of these static factories were meant to be
used on a small number of entries. If it truly has just been
not done until now, then the bug database will confirm that
easily.
When I get back, I can check myself.
On Thu, Jan 16, 2025, 6:25 PM David Alayachew
<davidalayac...@gmail.com> wrote:
I guess let me ask the obvious question.
Chesterton's fence -- why wasn't this done before? I
refuse to believe that this idea wasn't thought up years
ago, which leads me to believe there was a reason that it
hasn't been done.
Is there any way we can look this up in the bug database
or something?
On Thu, Jan 16, 2025, 2:28 PM Jens Lideström
<j...@lidestrom.se> wrote:
Having the result Map.of and Set.of preserve the
insertion order would
often be convenient.
More often than not programs iterate over the
contents of a maps and
sets at some point. For example to present the values
in a GUI, for
serialisation, or even for error printouts. In all
those cases having a
fixed iteration order is much better than having a
random iteration
order.
Often it is even a subtle bug to have a random
iteration order. For
example, I ran in to a situation where jdeps printed
a error message
containing a list of modules. But the list was in a
different order on
each run of the program! It took me a while to figure
out that it was
actually the same list. A possible explanation is
that jdeps is
implemented using Map.of or Set.of.
Because of this I think I would be better if the most
commonly used
standard collection factories produced collections
with a fixed
iteration order.
Guavas ImmutableMap and ImmutableSet also preserve
insertion order.
Regards,
Jens Lideström
On 2025-01-16 08:44, Remi Forax wrote:
> -------------------------
>
>> From: "Rafael Winterhalter" <rafael....@gmail.com>
>> To: "core-libs-dev" <core-libs-...@openjdk.java.net>
>> Sent: Thursday, January 16, 2025 8:13:17 AM
>> Subject: Factory methods for SequencedSet and
SequencedMap
>
>> Hello,
>
> Hello,
>
>> I am happily taking SequencedSet and SequencedMap
into use, but one
>> inconvenience I encounter is the lack of factory
methods for the two.
>> In code where many (initial) collections have zero
or one element (for
>> later aggregation), I now write
Set.of()/Set.of(one) and
>> Map.of()/Map.of(key, value), as it makes the code
shorter and more
>> readable. Those collections are of course
implicitly sequenced, but
>> now I must make the variable type of the
surrounding monad Set and
>> Map, and simply assume that a LinkedHashSet or
LinkedHashMap is used
>> when a collection of more than one element is set,
without requiring
>> the interface type. This does not require any type
casting, as I rely
>> on the iteration order only, but the code loses
some of its
>> expressiveness.
>> I did not find any discussion around introducing
factories for
>> SequencedSet.of(...) and SequencedMap.of(...),
similar to those that
>> exist in the Set and Map interfaces. Was this ever
considered, and if
>> not, could it be?
>
> Thanks for re-starting that discussion, it was
talked a bit, but not as
> it should be.
>
> So the issue is that currently we do not have any
compact, unmodifiable
> and ordered Set/Map implementation,
> one use case is when you have data that comes from
a JSON object as a
> Map and you want to keep the inserted order, if by
example the JSON is
> a config file editable by a human, an other example
is in unit tests
> where you want to help the dev to read the output
of the test so the
> code that creates a Set/Map and what is outputed by
the test should be
> in the same order.
> Currently there is no good solution for those use
cases because
> Set|Map.copyOf() does not keep the ordering.
>
> I see two solutions, either we add a new
> SequenceSet|SequenceMap.of/copyOf, or we change the
impleemntation of
> Set|Map.of()/copyOf().
> Python had gone for the latter solution, which has
the advantage a
> being simple from the user POV, but from an
algorithm expert POV, a Set
> and a SequencedSet are different concepts we may
want to emphasis ?
>
>> Best regards, Rafael
>
> regards,
> Rémi