problem with builders
John Hendrikx
hjohn at xs4all.nl
Mon Jul 16 23:44:37 PDT 2012
This is because the Builder classes are actually generic to make it
possible to subclass them, but still make it possible to return the
correct type. For example, a RectangleBuilder builds Rectangles, but it
extends ShapeBuilder which builds Shapes. In order for the extended
ShapeBuilder to know it should return RectangleBuilder for the
intermediate steps there is a generic parameter passed by RectangleBuilder:
public class RectangleBuilder<B extends RectangleBuilder<B>> extends
ShapeBuilder<B>
B here is RectangleBuilder.
Now, because you are using raw types in your code (you did not specify
the generic type for RectangleBuilder for example) and are calling
methods that are not part of RectangleBuilder directly (fill is from
ShapeBuilder) it cannot determine the correct type anymore when build is
called. You can resolve it by writing the code like this:
Label label = LabelBuilder.create().text("txt").build();
StackPane sp =
StackPaneBuilder.create().alignment(Pos.CENTER).build();
Rectangle r =
RectangleBuilder.create().fill(Color.ALICEBLUE).build();
On a side note, I've written such Builder constructs before, and there
is another way Oracle could have handled this -- they could have made
the final Builder implementations non-generic and then you could write
the code as you did -- it would however introduce another class for each
builder...
public abstract class AbstractRectangleBuilder<B> extends
AbstractShapeBuilder<B>
public final class RectangleBuilder extends
AbstractRectangleBuilder<RectangleBuilder>
Now the final class, which is used by users, is not generic and can be
used like you are doing without any problems at all.
--John
On 17/07/2012 03:55, Jose Martinez wrote:
>
> I am having a problem with some of the builders.... maybe I'm doing something wrong. If I instantiate a builder (e.g. LabelBuilder) then if I edit it (e.g. .text("txt") ) then the compiler complaints that the build() method is not present. Its as if the .text() method does not returns a LabelBuilder. It does not happen with all builders, I have not tested enough to pick up on a pattern.
>
> Here are some examples.....
>
> //will not compile
> LabelBuilder lb = LabelBuilder.create();
> Label label = lb.text("txt").build();
>
> //compiles
> StackPaneBuilder spb = StackPaneBuilder.create();
> StackPane sp = spb.alignment(Pos.CENTER).build();
>
> //will not compile
> RectangleBuilder rb = RectangleBuilder.create();
> Rectangle r = rb.fill(Color.ALICEBLUE).build();
>
> thanks
> jose
>
More information about the openjfx-dev
mailing list