I released version 1.0.0
of
jregions a while back and then
found that I wanted to make some changes to the API. I didn't want
to make a compatibility-breaking change this close to 1.0.0
, so I
decided to make the changes but keep some deprecated compatibility
methods in place.
However, some of the types involved are generated by the
immutables package. The way the package works
is that you define an abstract interface
type and immutables
generates an immutable implementation of
this interface. One of the parts of the generated implementation
is a builder type that allows you to construct instances of the
implementation type in multiple steps. For example, a declaration
like this:
@Value.Immutable interface SizeType { int width(); int height(); }
... would result in the generation of an immutable Size
class that
contained a mutable Size.Builder
type capable of constructing values
of Size
:
Size s = Size.builder().setWidth(640).setHeight(480).build();
In my case, I wanted to rename the width
and height
methods to
something more generic. Specifically, width
should be sizeX
and
height
should be sizeY
. Clearly, if I just renamed the methods
in the SizeType
, then the generated type and the generated builder
type would both be source and binary incompatible. I could do this:
@Value.Immutable interface SizeType { int sizeX(); int sizeY(); @Deprecated default int width() { return sizeX(); } @Deprecated default int height() { return sizeY(); } }
That would at least preserve source and binary compatibility for
the API of the generated type, but the generated builder type
would no longer have setWidth
or setHeight
methods, so
source and binary compatibility would be broken there. I asked
on the immutables.org
issue tracker, and right away Eugene
Lukash stepped in with a nice
solution. Thanks
again Eugene!