@Value was introduced as experimental feature in lombok v0.11.4.
Experimental because:
@Value
is the immutable variant of @Data
; all fields are made private
and final
by default, and instead of setters, each field gets a so-called 'wither',
which is a method that produces a clone with each field having the same value, except for the field you want a new value for. 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 @Wither
.
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
, @Getter
,
@Wither
.
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
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.