Compile-time annotation processor for generating immutable value objects with builder patterns and compile-time validation.
npx @tessl/cli install tessl/maven-org-immutables--value@2.10.0Immutables Value is a Java annotation processing toolkit for generating immutable value objects at compile time. It enables developers to define value types using interfaces, abstract classes, or annotations, and automatically generates builder patterns, immutable implementations, and fluent APIs with compile-time validation.
<dependency>
<groupId>org.immutables</groupId>
<artifactId>value</artifactId>
<version>2.10.1</version>
<scope>provided</scope>
</dependency>import org.immutables.value.Value;For generated classes (typical pattern):
// Generated class follows naming convention: Immutable + YourClassName
import com.example.ImmutablePerson;import org.immutables.value.Value;
import java.util.List;
import java.util.Optional;
// Define an immutable value type
@Value.Immutable
public interface Person {
String name();
int age();
List<String> hobbies();
Optional<String> email();
}
// Use the generated immutable implementation
Person person = ImmutablePerson.builder()
.name("John Doe")
.age(30)
.addHobbies("reading", "swimming")
.email("john@example.com")
.build();
// Create modified copies
Person updatedPerson = person.withAge(31);
// Access values
String name = person.name();
int age = person.age();
List<String> hobbies = person.hobbies(); // Returns immutable listImmutables Value is built around several key components:
The library generates immutable implementations that follow the "Immutable" prefix naming convention (customizable via Style), providing builders for construction, copy methods for modification, and standard object methods (equals, hashCode, toString).
Primary functionality for generating immutable value objects from abstract types with builder patterns, copy methods, and validation support.
@interface Value.Immutable {
boolean singleton() default false;
boolean intern() default false;
boolean copy() default true;
boolean prehash() default false;
boolean lazyhash() default false;
boolean builder() default true;
}Advanced attribute behavior including default values, lazy computation, derived values, and parameter configuration for flexible object modeling.
@interface Value.Default { }
@interface Value.Lazy { }
@interface Value.Derived { }
@interface Value.Parameter {
int order() default -1;
boolean value() default true;
}
@interface Value.Auxiliary { }Comprehensive styling system for customizing naming conventions, generation behavior, validation methods, and code structure.
@interface Value.Style {
// Naming templates (subset of 25+ naming options)
String[] get() default "get*";
String init() default "*";
String with() default "with*";
String add() default "add*";
String builder() default "builder";
String build() default "build";
String copyOf() default "copyOf";
String of() default "of";
// Type naming templates (subset of 10+ type naming options)
String typeImmutable() default "Immutable*";
String typeBuilder() default "Builder";
String typeModifiable() default "Modifiable*";
// Behavioral configuration (subset of 50+ configuration options)
boolean strictBuilder() default false;
boolean stagedBuilder() default false;
boolean allParameters() default false;
boolean jdkOnly() default false;
ValidationMethod validationMethod() default ValidationMethod.SIMPLE;
ImplementationVisibility visibility() default ImplementationVisibility.SAME;
BuilderVisibility builderVisibility() default BuilderVisibility.PUBLIC;
// ... 60+ additional configuration options for advanced customization
}Built-in validation framework with constraint checking, invariant validation, and custom exception handling.
@interface Value.Check { }
@interface Value.Redacted { }
@interface Value.NonAttribute { }
enum ValidationMethod {
NONE, MANDATORY_ONLY, SIMPLE, VALIDATION_API
}
enum ImplementationVisibility {
PUBLIC, SAME, PACKAGE, PRIVATE
}
enum BuilderVisibility {
PUBLIC, SAME, PACKAGE
}Specialized features including modifiable companions, collection ordering, inclusion patterns, and enclosing type organization.
@interface Value.Modifiable { }
@interface Value.Include {
Class<?>[] value();
}
@interface Value.Enclosing { }
@interface Value.NaturalOrder { }
@interface Value.ReverseOrder { }@interface Value {
// Main namespace annotation containing all nested annotations
}
@interface Generated {
String from() default "";
String generator() default "";
}