Records -- current status

Brian Goetz brian.goetz at
Thu Apr 12 01:22:50 UTC 2018

On 4/11/2018 7:46 PM, Stephen Colebourne wrote:
> On 16 March 2018 at 18:55, Brian Goetz <brian.goetz at> wrote:
>> There are a number of potentially open details on the design for records.
>> My inclination is to start with the simplest thing that preserves the
>> flexibility and expectations we want, and consider opening up later as
>> necessary.
> I'd like to agree, but I fear that what is proposed is too
> restrictive, and that it will be an attractive nuisance, especially
> given the large cliff edge (acknowledged by the docs as being a
> problem, but I worry "wait" for the improvements in classes may get
> overtaken by other more pressing concerns). The cliff egde is my
> biggest concern with records.

Yes, I would expect no other reaction.  And we are well aware of all of 
the issues you've raised.
> Having to redeclare all fields as constructor parameters when
> validating in a primary constructor would be unhelpful boilerplate -
> I'm not clear if that is still required.

No, that's been resolved.

>>   - Additional instance fields.  These are a much bigger concern. While the
>> primary arguments against them are of the "slippery slope" variety, I still
>> have deep misgivings about supporting unrestricted non-principal instance
>> fields, and I also haven't found a reasonable set of restrictions that makes
>> this less risky.
> This is a big deal for me. We use additional fields all the time.

Yes, I understand your concern.

> The field could be hidden, say by a `cached` keyword to any method:
>    public cached String name() {
>      return firstName + " " + surname;
>    }

Yes, this is one of the middle grounds being considered.

> Those fields are not part of the state. They do not get used in equals
> or hashCode.

Yes, but the only way to prevent that is to prevent anyone from 
overriding equals/hashCode.  Which is equally unpopular.  Right now both 
are restricted, until we figure out which we are better off relaxing on.

> Fields being final by default with a non-final keyword seems OK,
> although perhaps `mutable record`

Can we please have a moratorium on syntax niggling until the semantics 
are nailed down?

> - Caching of hashCode() is vital for performance in certain cases
> where object used as a Map key. Not having this feature would prevent
> use of records in use cases where it really makes sense. This feature
> could be done for all immutable records, or it could be opt in. This
> is a must have for me.
Oh, well, if its a must have for you, we'll get right on it ;)

Seriously, we're well aware of this issue.

> - Records add the ability to convert data in and out in a standard way
> by a standard field name, exactly as needed by serialization
> frameworks and similar. However, there is currently no library
> proposal to provide an abstraction across records, JavaBeans and other
> classes representing data. I think it would be a mistake to introduce
> records without also introducing a library providing that abstraction
> into the java.base module.

The machinery for pattern matching will be that common link.  By 
providing a "principle deconstructor" (and matching it with a 
constructor of the same descriptor), you say to frameworks "here's how 
to scoop out my data, freeze it, and reconstitute me later."

More information about the amber-dev mailing list