@Value
was introduced as experimental feature in lombok v0.11.4.
@Value
no longer implies @Wither
since lombok v0.11.8.
Experimental because:
@Value
is the immutable variant of @Data
; all fields are made private
and final
by default, and setters are not generated. The class itself is also made final
by default, because immutability is not something that can be forced onto a subclass. Like @Data
, useful toString()
, equals()
and hashCode()
methods are also generated, each field gets a getter method, and a constructor that covers every
argument (except final
fields that are initialized in the field declaration) is also generated.
In practice, @Value
is shorthand for: final @ToString @EqualsAndHashCode @AllArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter
.
It is possible to override the final-by-default and private-by-default behaviour using either an explicit access level on a field, or by using the @NonFinal
or @PackagePrivate
annotations.
It is possible to override any default behaviour for any of the 'parts' that make up @Value
by explicitly using that annotation.
Look for the documentation on the 'parts' of @Value
: @ToString
, @EqualsAndHashCode
, @AllArgsConstructor
, @FieldDefaults
, and @Getter
.
For classes with generics, it's useful to have a static method which serves as a constructor, because inference of generic parameters via static methods works in java6 and avoids having to use the diamond operator. While you can force this by applying an explicit @AllArgsConstructor(staticConstructor="of")
annotation, there's also the @Value(staticConstructor="of")
feature, which will make the generated all-arguments constructor private, and generates a public static method named of
which is a wrapper around this private constructor.