Introduction
- Project Lombok is a java library that automatically plugs into your editor and build tools.
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
Why use this library
Helps get rid of many boilerplate code for POJOs
- constructors
- getters
- setters
- toString
- equals
- hashCode
Keywords
local variables without worrying about the type.
import org.lombok.val;
val
val makes the variable as final
;
val map = new HashMap<Integer, String>();
...
...
for(val entry: map.entrySet())
final HashMap<Integer, String> map = new HashMap<Integer, String>();
for(final Map.Entry<Integer, String> entry: map.entrySet())
var
var map = new HashMap<Integer, String>();
...
...
for(var entry: map.entrySet())
Annotations
@Data
// @Getter - all fields
// @Setter - non final fields
// @ToString
// @EqualsAndHashCode
// @RequiredArgsConstructor
@Builder(
builderClassName = "ActorBuilder",
builderMethodName = "anActor",
buildMethodName = "execute",
access = AccessLevel.PUBLIC,
setterPrefix = "set",
toBuilder = true // actorObject.toBuilder().id(5).build()
)
public class Actor{
private int id;
@Builder.Default
private String name;
private String topRole;
@Singular // used with @Builder on List, Set and Map
private List<String> movies;
// Default
Actor actor = Actor.builder().id(1).build();
// with customization
Actor actor = Actor.anActor().setId(1).execute();
// with @Builder along with @Singular
Actor actor = Actor.builder().id(1)
.movie("Secret Life Walter Mitty") // add single movie
.clearMovies() // clear the collection
.movies(List.of("Martian", "Interstellar")) // add multiple movies
// no setter to set the collection
.build();
//
}
// no callSuper argument for @Builder
@SuperBuilder
public class Actor extends Person {
private int id;
}
@Getter
@Setter
@Accessors(chain = true, fluent = true) // customize setters and getters, fluent -> returns instance itself
@ToString(includeFieldNames = false, callSuper = true)
@EqualsAndHashCode(callSuper = true)
@RequiredArgsConstructor // includes final and @NonNull
@NoArgsConstructor // empty constructors
@AllArgsConstructor // all fields
public class Actor extends Person{
private int id; // public is the default access level
@Getter(AccessLevel.PROTECTED)
@ToString.Exclude
@EqualsAndHashCode.Exclude
private String name;
@NonNull
@Setter(AccessLevel.PACKAGE)
private String topRole;
@Getter(lazy=true)
private final List<String> data = initData();
private List<String> initData(){
// does some heavy stuff
// returns data
}
}
Actor actor = new Actor();
// chaining of fluid setters due to @Accessors(chain = true, fluent = true)
actor.id(1).name("Arpit Tripathi").topRole("Superb");
@ToString(onlyExplicitlyIncluded = true)
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = true)
public class Actor{
private int id;
@ToString.Include
@EqualsAndHashCode.Include
private String name;
private String topRole;
private final List<String> data = initData();
}
// given resource is automatically cleaned-up or closed before code execution path exits current scope
@Cleanup
BufferedReader reader = new BufferedReader(new FileReader(in));
@Cleanup
BufferedWriter writer = new BufferedWriter(new FileWriter(out));
writer.write(reader.readLine())
// Logger Annotations - creates field called log
@CommonsLog // org.apache.commons.logging.Log
@Flogger // com.google.common.flogger.FluentLogger
@JBossLog // org.jboss.logging.Logger
@Log // java.util.logging.Logger
@Log4j // org.apache.log4j.Logger
@Log4j2 // org.apache.logging.log4j.Logger
@Slf4j // org.slf4j.Logger
@XSlf4j // org.slf4j.ext.XLogger
Immutable Class
@Value
class Actor {
private int id;
}