Feedback on records (JEP 359)
Brian Goetz
brian.goetz at oracle.com
Sat Apr 25 18:42:28 UTC 2020
On 4/25/2020 2:05 PM, Anthony Vanelverdinghe wrote:
> Would you mind to clarify why the order [...] being semantically
> significant is a problem?
Because there are multiple consumers of this order, and they don't
always want the same thing.
If I have
record Name(String first, String last) { }
and I then want to add Comparable, but I want sorting (last, first), I'm
already hosed, since changing the order of the components is not a
compatible change. And I am writing from scratch, I don't have this
particular problem, but the natural order in which to declare the
components when I think about the record may not be the natural ordering
on which I want to sort. So I would have two features that are
_already_ fighting for control over the order. (And, what if there were
more order-dependent features? This game doesn't even scale to two, let
alone more.)
The main problem is that there is simply no reasonable way to infer a
"right at least 99% of the time" sort order from the declaration of the
components. The sensible sort order may be any permutation of any
subset of the components. The feature, as you proposed, would be
frustrating at least as often as it is satisfying. (And while _you
personally_ might believe you'll never ask for knobs, and might even be
right, the probability that people will then come back and say "why
can't I put an annotation on the component to indicate its role in the
sort order" is 100%. And now we're on the slippery slope back to
Lombok-land.)
So basically, this is half a feature, for which we actively don't want
to do the other half, which means we can't do the first half either.
> As I see it, the problem is that, for me, something like `record
> TrackId(Year year, String albumTitle, int trackNumber)` just screams
> at me: "hey, I'm Comparable, just as you'd expect me to be". And it
> bothers me that I have to write the code nonetheless
I get this; we'd all like to write less code (and we're getting there,
bit by bit.) But this is a "writing code" argument, not a "reading
code" argument. Reading code is more important than writing code. If
we were to infer a sort order, it would have to be the obvious one the
overwhelming majority of the time. And we're not even close to close on
that. So we have to say no to that, even though it might be helpful in
some cases.
More information about the amber-dev
mailing list