You can annotate any field with @Getter
and/or @Setter
, to let lombok generate the default getter/setter automatically.
A default getter simply returns the field, and is named getFoo
if the field is called foo
(or isFoo
if the field's type is boolean
). A default setter is named setFoo
if the field is called foo
, returns void
,
and takes 1 parameter of the same type as the field. It simply sets the field to this value.
The generated getter/setter method will be public
unless you explicitly specify an AccessLevel
, as shown in the example below.
Legal access levels are PUBLIC
, PROTECTED
, PACKAGE
, and PRIVATE
.
You can also put a @Getter
and/or @Setter
annotation on a class. In that case, it's as if you annotate all the non-static fields in that
class with the annotation.
You can always manually disable getter/setter generation for any field by using the special AccessLevel.NONE
access level. This lets you override the
behaviour of a @Getter
, @Setter
or @Data
annotation on a class.
To put annotations on the generated method, you can use onMethod=@_({@AnnotationsHere})
; to put annotations on the only parameter of a generated setter method, you can use onParam=@_({@AnnotationsHere})
. Be careful though! This is an experimental feature. For more details see the documentation on the onX feature.
For generating the method names, the first character of the field, if it is a lowercase character, is title-cased, otherwise, it is left unmodified. Then, get/set/is is prefixed.
No method is generated if any method already exists with the same name (case insensitive) and same parameter count. For example, getFoo()
will not be generated if there's already a method getFoo(String... x)
even though it is technically possible to make the method. This caveat
exists to prevent confusion. If the generation of a method is skipped for this reason, a warning is emitted instead. Varargs count as 0 to N parameters.
For boolean
fields that start with is
immediately followed by a title-case letter, nothing is prefixed to generate the getter name.
Any variation on boolean
will not result in using the is
prefix instead of the get
prefix; for example,
returning java.lang.Boolean
results in a get
prefix, not an is
prefix.
Any annotations named @NonNull
(case insensitive) on the field are interpreted as: This field must not ever hold
null. Therefore, these annotations result in an explicit null check in the generated setter. Also, these
annotations (as well as any annotation named @Nullable
or @CheckForNull
) are copied to setter parameter and getter method.
You can annotate a class with a @Getter
or @Setter
annotation. Doing so is equivalent to annotating all non-static fields
in that class with that annotation. @Getter
/@Setter
annotations on fields take precedence over the ones on classes.
Using the AccessLevel.NONE
access level simply generates nothing. It's useful only in combination with
@Data
or a class-wide @Getter
or @Setter
.
@Getter
can also be used on enums. @Setter
can't, not for a technical reason, but
for a pragmatic one: Setters on enums are an extremely bad idea.