@Data
is a convenient shortcut annotation that bundles the features of @ToString
,
@EqualsAndHashCode and @Getter
/ @Setter
together: In other words, @Data
generates all the boilerplate that is normally associated with simple POJOs
(Plain Old Java Objects) and beans: getters for all fields, setters for all non-final fields, and appropriate toString
, equals
and hashCode
implementations that involve the fields of the class. In addition, @Data
generates a constructor that
initializes all final fields, as well as all non-final fields with no initializer that have been marked with @NonNull
or @NotNull
,
in order to ensure the field is never null.
@Data
is like having implicit @ToString
and @EqualsAndHashCode
annotations on the class.
However, the parameters of @ToString
and @EqualsAndHashCode
(such as callSuper
, includeFieldNames
and
exclude
) cannot be set with @Data
. If you need to set non-default values for any of these parameters, just add those annotations
explicitly; @Data
is smart enough to defer to those annotations.
All generated getters and setters will be public
. To override the access level, annotate the field with an explicit @Setter
and/or
@Getter
annotation. You can also use this annotation (by combining it with AccessLevel.NONE
) to suppress generating a getter and/or setter
altogether.
All fields marked as transient
will not be considered for hashCode
and equals
. All static fields will be
skipped entirely (not considered for any of the generated methods, and no setter/getter will be made for them).
If the class already contains a method with the same name as any method that would normally be generated, that method is not generated, and no warning or
error is emitted. For example, if you already have a method with signature void hashCode(int a, int b, int c)
, no int hashCode()
method will be generated, even though technically int hashCode()
is an entirely different method. The same rule applies to the constructor,
toString
, equals
, and all getters and setters.
@Data
can handle generics parameters for fields just fine. In order to reduce the boilerplate when constructing objects for classes with
generics, you can use the staticConstructor
parameter to generate a private constructor, as well as a static method that returns a new
instance. This way, javac will infer the variable name. Thus, by declaring like so: @Data(staticConstructor="of") class Foo<T> { private T x;}
you can create new instances of Foo
by writing: Foo.of(5);
instead of having to write: new Foo<Integer>(5);
.
See the small print of @ToString
, @EqualsAndHashCode
and
@Getter / @Setter
.
Any annotations named @NonNull
(case insensitive) on a field are interpreted as: This field must not ever hold
null. Therefore, these annotations result in an explicit null check in the generated constructor for the provided field. Also, these
annotations (as well as any annotation named @Nullable
) are copied to the constructor parameter, in both the true constructor and
any static constructor. The same principle applies to generated getters and setters (see the documentation for @Getter / @Setter)