Data classes are your way to go when you want to store information, but they have been very tedious to create.
The problem
Imagine you have a simple data class called Cuboid
that describes a geomatrical cuboid. It gets defined by three doubles:
- Width, called sizeX
- Height, called sizeY
- Depth, called sizeZ
Of course our Cuboid should also implement the equals
, hashCode
and toString
methods.
Normally, we would now go ahead and write this:
import java.util.Objects; public class Cuboid { private final double sizeX; private final double sizeY; private final double sizeZ; public Cuboid(double sizeX, double sizeY, double sizeZ) { this.sizeX = sizeX; this.sizeY = sizeY; this.sizeZ = sizeZ; } public double getSizeX() { return sizeX; } public double getSizeY() { return sizeY; } public double getSizeZ() { return sizeZ; } @Override public String toString() { return "Cuboid{" + "sizeX=" + sizeX + ", sizeY=" + sizeY + ", sizeZ=" + sizeZ + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Cuboid cuboid = (Cuboid) o; return Double.compare(cuboid.sizeX, sizeX) == 0 && Double.compare(cuboid.sizeY, sizeY) == 0 && Double.compare(cuboid.sizeZ, sizeZ) == 0; } @Override public int hashCode() { return Objects.hash(sizeX, sizeY, sizeZ); } }
That’s 47(!) lines just for a tiny data class that doesn’t do anything besides storing 3 double values…
Solution 1 (Java 15+): Record classes
Java 15 introduced a new awesome feature called Records. By using them, we can narrow the complete code down to only one line:
public record Cuboid(double sizeX, double sizeY, double sizeZ) { }
Java automatically provides all methods that we had to implement ourselves in the above code! The only difference is that the getters are not called getSizeX()
etc, but are simply called sizeX()
.
Solution 2: Lombok
When you cannot use Records because your users are still running Minecraft 1.8 (WTF) or didn’t update to Java 15+ yet, you can use the Lombok framework instead.
Just add Lombok to your project, e.g. when using maven:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <scope>provided</scope> </dependency>
Now we can simply annotate our class with the @Data
annotation:
import lombok.Data; @Data public class Cuboid { private final double sizeX; private final double sizeY; private final double sizeZ; }
Once again, we got rid of defining constructors, getters and the hashCode, toString and equals method! Lombok will automatically generate all this stuff for you!
You can learn more about Lombok here – it has many other awesome features!
Join my Discord Server for feedback or support. Just check out the channel #programming-help
🙂