Generate Data Classes in Java
In the ever-evolving world of software development, where efficiency meets precision, the concept of "data classes" emerges as a vital tool for developers. Have you ever wondered how to handle plain objects in Java elegantly? This article delves ...

I am Tuanh.net. As of 2024, I have accumulated 8 years of experience in backend programming. I am delighted to connect and share my knowledge with everyone.
1. What Are Data Classes?
1.1 Why Use Data Classes?
- Code readability: Cleanly define your data structures.
- Maintainability: Centralize data-related logic.
- Efficiency: Improve serialization and deserialization processes, often used with JSON, XML, or database layers.
public class Person {
private String name;
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// toString method
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
2. Methods to Generate Data Classes in Java
2.1 Using IDE Shortcuts
- Create a new class.
- Use the Generate shortcut (Alt + Insert on Windows or Cmd + N on Mac).
- Select Constructor, Getters and Setters, and other methods.
- Saves time by automating repetitive tasks.
- Ensures consistency in generated code.
2.2 Leveraging Lombok Annotations
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
}
- @Data: Combines @Getter, @Setter, @ToString, @EqualsAndHashCode, and @RequiredArgsConstructor.
- @Builder: Adds builder pattern support.
- @Value: Creates immutable data classes.
- Cleaner code with reduced clutter.
- Easier refactoring.
- Dependency on an external library.
- Debugging can be less transparent.
2.3 Using Java Records (Java 16+)
- Fields
- Constructor
- Accessors
- toString(), equals(), and hashCode() methods.
public record Person(String name, int age) {}
- Concise syntax with minimal boilerplate.
- Immutable by design.
- Not suitable for mutable data or complex inheritance hierarchies.
- Requires Java 16 or higher.
3. Common Practices Around Data Classes
3.1 Ensuring Immutability
- final fields.
- No setters.
public final class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
3.2 Adding Validation
public class Person {
private String name;
private int age;
public Person(String name, int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
this.name = name;
this.age = age;
}
}
4. Integrating Data Classes in Real-World Scenarios
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String json = "{"name": "Alice", "age": 25}";
// Deserialize JSON to Person
Person person = mapper.readValue(json, Person.class);
System.out.println(person);
// Serialize Person to JSON
String output = mapper.writeValueAsString(person);
System.out.println(output);
}
}
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
for (Person person : people) {
System.out.println(person);
}
}
}
5. Conclusion
Read more at : Generate Data Classes in Java





