Project Lombok is a Java library that helps reduce boilerplate code. Java is a verbose language where repetitive code like getters, setters, etcetera, can be avoided. Lombok reduces the boilerplate code with annotations that get plugged during the build process.
Lombok can easily be added to the project as one of the dependencies.
If the project is a Gradle project, then we add the following two lines to the dependencies section of the build.gradle
file:
compileOnly 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.projectlombok:lombok:1.18.22'
If the project is a Maven project, then add the following two lines to the dependencies section of the pom.xml
file:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
</dependencies>
Certain fields of classes are expensive to compute. Recomputing the values for such fields can make the system overloaded. Hence, we can compute the value for the field once, cache it, and every time the getter for that field is invoked, the value from the cache is returned. The fields that need this kind of behavior need to be private
and final
.
To enable lazy behavior on a field, we pass lazy=true
to the @Getter
annotation. The thread safety of the expensive computation will be taken care of by Lombok.
import lombok.Getter; public class Main { static class Ball { @Getter(lazy = true) private final double speed = complexPhysicsEquation(); private double complexPhysicsEquation() { System.out.println("Solving complex equation..."); return 5.643; } } public static void main(String[] args) { Ball ballObject = new Ball(); System.out.println("1st Getter invocation - Speed of the ball - " + ballObject.getSpeed()); System.out.println("------"); System.out.println("2nd Getter invocation - Speed of the ball - " + ballObject.getSpeed()); } }
Ball
.speed
. The field is annotated with the Getter
annotation with the parameter lazy
as true
. The value of the field is the value returned by the method complexPhysicsEquation()
.complexPhysicsEquation()
. Assume that the method computes a complex physics equation.Ball
class is created called ballObject
.speed
field twice. The first time the getter is invoked, the complexPhysicsEquation()
method is executed and the result is cached. The second time the getter is invoked, the cached value is returned.