> De: "Brian Goetz" <brian.go...@oracle.com>
> À: "Remi Forax" <fo...@univ-mlv.fr>
> Cc: "amber-spec-experts" <amber-spec-experts@openjdk.java.net>
> Envoyé: Vendredi 26 Juillet 2019 03:05:20
> Objet: Re: Records: migration compatibility

>> enums is a counter example here, no ?

>> for enums, the only refactoring allowed is from a class to an enum,
>> the other direction doesn't work because all enums inherits from 
>> java.lang.Enum.

> In reality, compatibility is not a binary thing. Yes, if the client depends on
> Enum methods, then migrating in the other direction will fail. But if the
> client depends only on the enum constants, it is fine, because resolving
> EnumClass.X is done with getstatic either way.

> Its not unlike adding a method; adding a method is generally considered source
> compatible, but not if there is another method of the same name and same
> arguments but different return type. There are all sorts of asterisks
> associated with “binary compatible” and “source compatible."

It's true if a user control all the codes that uses the enum values, 
but once you use external libraries (by example a JSON serializer like jackson 
that serialize object and enum differently), you start to have a more strict 
view of what is binary compatible or not. 

>> given that a record already have a different behavior at runtime than a 
>> nomrla
>> class (the Record attribute),
>> a public abstract class (AbstractRecord), the migration B seems unlikely.

> With enums, the migration in both directions is common. Class-to-enum was 
> common
> when we had classes using the type safe enum pattern; but its not uncommon to
> exceed what can be done with an enum, and refactor back to a class. I could
> imagine the same happening with records quite easily.

for records, we have a reflection method to extract the name of component of 
the primary constructor, you can not do that with a class, at best you have a 
de-constructor but it's a positional way to see the values of a record, no a 
named way to see the values of a record. 
So again, migration from a record to a class will depend if you use third party 
libraries that use reflection or not. 

>> BTW, AbstractRecord also has the nasty side effect of not allowing inline
>> record.

> Good point. We’ve been talking about whether inline classes should be able to
> inherit from abstract classes with no state….

Rémi 

Reply via email to