diff --git a/website/templates/features/Builder.html b/website/templates/features/Builder.html index 058810837..4fd907411 100644 --- a/website/templates/features/Builder.html +++ b/website/templates/features/Builder.html @@ -66,7 +66,7 @@
Now that the "method" mode is clear, putting a @Builder
annotation on a constructor functions similarly; effectively, constructors are just static methods that have a special syntax to invoke them: Their 'return type' is the class they construct, and their type parameters are the same as the type parameters of the class itself.
- Finally, applying @Builder
to a class is as if you added @AllArgsConstructor(access = AccessLevel.PACKAGE)
to the class and applied the @Builder
annotation to this all-args-constructor. This only works if you haven't written any explicit constructors yourself or allowed lombok to create one such as with @NoArgsConstructor
. If you do have an explicit constructor, put the @Builder
annotation on the constructor instead of on the class. Note that if you put both `@Value` and `@Builder` on a class, the package-private constructor that `@Builder` wants to generate 'wins' and suppresses the constructor that `@Value` wants to make.
+ Finally, applying @Builder
to a class is as if you added @AllArgsConstructor(access = AccessLevel.PACKAGE)
to the class and applied the @Builder
annotation to this all-args-constructor. This only works if you haven't written any explicit constructors yourself or allowed lombok to create one such as with @NoArgsConstructor
. If you do have an explicit constructor, put the @Builder
annotation on the constructor instead of on the class. Note that if you put both @Value
and @Builder
on a class, the package-private constructor that @Builder
wants to generate 'wins' and suppresses the constructor that @Value
wants to make.
If using @Builder
to generate builders to produce instances of your own class (this is always the case unless adding @Builder
to a method that doesn't return your own type), you can use @Builder(toBuilder = true)
to also generate an instance method in your class called toBuilder()
; it creates a new builder that starts out with all the values of this instance. You can put the @Builder.ObtainVia
annotation on the parameters (in case of a constructor or method) or fields (in case of @Builder
on a type) to indicate alternative means by which the value for that field/parameter is obtained from this instance. For example, you can specify a method to be invoked: @Builder.ObtainVia(method = "calculateFoo")
.
@@ -228,7 +228,7 @@
@Builder
for copy constructors: foo.toBuilder().build()
makes a shallow clone. Consider suppressing the generating of the
builder
method if you just want this functionality, by using: @Builder(toBuilder = true, builderMethodName = "")
.
- Due to a peculiar way javac processes static imports, trying to do a non-star static import of the static builder()
method won't work. Either use a star static import: `import static TypeThatHasABuilder.*;` or don't statically import the builder
method.
+ Due to a peculiar way javac processes static imports, trying to do a non-star static import of the static builder()
method won't work. Either use a star static import: import static TypeThatHasABuilder.*;
or don't statically import the builder
method.
If setting the access level to PROTECTED
, all methods generated inside the builder class are actually generated as public
; the meaning of the
protected
keyword is different inside the inner class, and the precise behavior that PROTECTED
would indicate (access by any source in the same package is allowed, as well as any subclasses from the outer class, marked with @Builder
is not possible, and marking the inner members public
is as close as we can get.