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:

  1. equals() - Compares objects by their values
  2. hashCode() - Generates hash codes for collections
  3. toString() - Creates readable string representation
  4. copy() - Creates a copy with optional modifications
  5. componentN() - 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() and toString()
  • 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

  1. Keep data classes simple and focused on data storage
  2. Use immutable properties (val) when possible
  3. Avoid complex logic in data classes
  4. Use meaningful property names
  5. 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.