This set of 3 annotations generate a constructor that will accept 1 parameter for certain fields, and simply assigns this parameter to the field.
@NoArgsConstructor
will generate a constructor with no parameters. If this is not possible (because of final fields), a compiler error will result instead.
For fields with constraints, such as @NonNull
fields, no check or assignment is generated, so be aware that these constraints may then not be
fulfilled until those fields are properly initialized later. Certain java constructs, such as hibernate and the Service Provider Interface require a no-args constructor.
This annotation is useful primarily in combination with either @Data
or one of the other constructor generating annotations.
@RequiredArgsConstructor
generates a constructor with 1 parameter for each field that requires special handling. All final
fields get a parameter,
as well as any fields that are marked as @NonNull
that aren't initialized where they are declared. For those fields marked with @NonNull
, an explicit
null check is also generated. The constructor will throw a NullPointerException
if any of the parameters intended for the fields marked with @NonNull
contain null
. The order of the parameters match the order in which the fields appear in your class.
@AllArgsConstructor
generates a constructor with 1 parameter for each field in your class. Fields marked with @NonNull
result in null checks on
those parameters.
Each of these annotations allows an alternate form, where the generated constructor is always private, and an additional static factory method that wraps around the
private constructor is generated. This mode is enabled by supplying the staticName
value for the annotation, like so: @RequiredArgsConstructor(staticName = "of")
.
Such a static factory method will infer generics, unlike a normal constructor. This means your API users get write MapEntry.of("foo", 5)
instead of the much longer
new MapEntry<String, Integer>("foo", 5)
.
Static fields are skipped by these annotations. Also, a @java.beans.ConstructorProperties
annotation is added for all constructors with at least 1 argument,
which allows bean editor tools to call the generated constructors. @ConstructorProperties
is now in Java 1.6, which means that if your code is intended for
compilation on Java 1.5, a compiler error will occur. Running on a JVM 1.5 should be no problem (the annotation will be ignored). To suppress the generation of
the @ConstructorProperties
annotation, add a parameter to your annotation: @AllArgsConstructor(suppressConstructorProperties=true)
. However,
as java 1.5, which has already been end-of-lifed, fades into obscurity, this parameter will eventually be removed. It has also been marked deprecated for this reason.
Unlike most other lombok annotations, the existence of an explicit constructor does not stop these annotations from generating their own constructor. This means you can write your own specialized constructor, and let lombok generate the boilerplate ones as well. If a conflict arises (one of your constructors ends up with the same signature as one that lombok generates), a compiler error will occur.
Even if a field is explicitly initialized with null
, lombok will consider the requirement to avoid null as fulfilled, and will NOT consider
the field as a 'required' argument. The assumption is that if you explicitly assign null
to a field that you've also marked as @NonNull
signals you must know what you're doing.
The @java.beans.ConstructorProperties
annotation is never generated for a constructor with no arguments. This also explains why @NoArgsConstructor
lacks the suppressConstructorProperties
annotation method. The @ConstructorProperties
annotation is also omitted for private constructors. The
generated static factory methods also do not get @ConstructorProperties
, as this annotation can only be added to real constructors.
@XArgsConstructor
can also be used on an enum definition. The generated constructor will always be
private, because non-private constructors aren't legal in enums. You don't have to specify AccessLevel.PRIVATE
.