A data class in Kotlin is a special type of class designed specifically for holding data. Think of it as a simple container that automatically comes with useful features, saving you from writing boilerplate code.
Auto-Generated Features
When you declare a data class, Kotlin automatically generates several useful methods:
data class User(val name: String, val age: Int)
This simple declaration gives you:
equals()
- Compares objects by their valueshashCode()
- Generates hash codes for collectionstoString()
- Creates readable string representationcopy()
- Creates a copy with optional modificationscomponentN()
- Enables destructuring declarations
Example Usage
// Creating an instance
val user = User("John", 30)
// Using copy() to create a modified copy
val olderUser = user.copy(age = 31)
// Destructuring declaration
val (name, age) = user
Data Class vs Normal Class
graph TD subgraph DataClass["Data Class"] A1["Auto-generated methods"] A2["Must have constructor properties"] A3["Best for data containers"] end subgraph NormalClass["Normal Class"] B1["Manual method implementation"] B2["Optional constructor properties"] B3["Best for behavior/logic"] end DataClass -->|"equals()"| Methods DataClass -->|"hashCode()"| Methods DataClass -->|"toString()"| Methods DataClass -->|"copy()"| Methods DataClass -->|"componentN()"| Methods
When to Use Data Classes
Use Data Classes When:
- You need a simple data container
- You want to avoid writing boilerplate code
- You need built-in methods like
copy()
andtoString()
- You’re working with data transfer objects (DTOs)
- You need to compare objects by their values
Use Normal Classes When:
- You need to implement complex behavior
- You don’t need automatic method generation
- You’re creating utility classes
- You need to extend other classes
- You’re implementing interfaces with custom logic
Example: Normal Class vs Data Class
// Normal Class
class Person(val name: String, val age: Int) {
// You need to manually implement:
// - equals()
// - hashCode()
// - toString()
// - copy()
}
// Data Class
data class User(val name: String, val age: Int)
// All methods are automatically generated!
Best Practices
- Keep data classes simple and focused on data storage
- Use immutable properties (
val
) when possible - Avoid complex logic in data classes
- Use meaningful property names
- Consider using data classes for API responses and database entities
Summary
Data classes are a powerful feature in Kotlin that help reduce boilerplate code while providing useful functionality out of the box. They’re perfect for scenarios where you need to store and transfer data, but remember to use normal classes when you need more complex behavior or custom implementations.