Clarifying record reflective support

forax at forax at
Wed Dec 4 01:05:38 UTC 2019

----- Mail original -----
> De: "Maurizio Cimadamore" <maurizio.cimadamore at>
> À: "Remi Forax" <forax at>
> Cc: "Chris Hegarty" <chris.hegarty at>, "amber-spec-experts" <amber-spec-experts at>, "joe darcy"
> <joe.darcy at>
> Envoyé: Mercredi 4 Décembre 2019 01:26:11
> Objet: Re: Clarifying record reflective support

> On 04/12/2019 00:17, forax at wrote:
>> I don't follow you, conceptually a pattern matching is an optional of
>> tuples (i don't want to go more deep than that given that the real
>> implementation is still in flux), you can construct an optional if
>> getReturnComponents() returns null or not.
> Right - but what happens when you do:
> Class<?> x = ...
> if (x instanceof Class.recordComponents(var components)) {
>    ...
> }

I believe you mean something like 'matches' not 'instanceof'.

> If the method Class::getRecordComponents always returns something (e.g.
> an empty array) and we claim that a deconstructor here is the dual case
> of that, that might suggest that the pattern above always matches (in
> some cases with 'components' bound to an empty array). My guts is that
> people writing the above code will want it NOT to match if 'x' is not a
> record class; but if you go there, then you have what seems like an
> asymmetry: I can ask String.class.getRecordComponents (and get an empty
> array) but I can pattern-match String.class, because the extractor also
> does the 'isRecord' trick, and fail to match if that returns false.
> Not saying it's not doable... but feels more awkward for some reason.

Calling an arbitrary methods inside an instanceof/switch is pure evil for me,
i've been roughly bitten several times by implementations of the method unapply() in Scala doing side-effects and i see no point to introduce such shenanigans in Java.

For 'matches', i suppose it should be based on Optional and/or null, being based on both is a kind of cool, like the enhanced for can be used on array or on Iterable, but is it enough to pass the bar to be included in Java ?
If it works on something like an Optional, you may have to use filter:

  if (x matches Class.recordComponents(var components).filter(Class::isRecord)) {


> Maurizio


More information about the amber-spec-experts mailing list