value class vs data class
- Kotlin course
- Intermediate
- Lesson 80/116
- 5 min
Learn the difference between value class and data class.
value class vs data class
A value class wraps a single value with zero overhead; a data class holds multiple fields and generates equals, hashCode, toString and copy. Use a value class for type safety and a data class for data modeling.
Example: @JvmInline value class Email(val address: String) wraps a single email address. data class User(val name: String, val age: Int) holds two fields together. A value class cannot add a second field; a data class takes as many as you need. Both can be immutable.
Comparison table
Value class: single val field, requires @JvmInline, no generated equals/hashCode, inlined at runtime. Data class: multiple fields, data modifier, auto-generated equals/hashCode/toString/copy.
Wrapping an email address as Email instead of String suits a value class: one field, type safety. Modeling a user with name and age suits a data class: many fields, helper methods. Both can combine: data class User(val name: String, val email: Email).
Practice Define Email and User
Define @JvmInline value class Email(val address: String). Define data class User(val name: String, val age: Int). In main create val e = Email("alex@x.com") and val u = User("Alex", 30); print with println(e) and println(u).
Starter code
// Define the Email value class: value class
// Define the User data class: name and age
fun main() {
// Create Email and User instances and print
}Sample solution
@JvmInline
value class Email(val address: String)
data class User(val name: String, val age: Int)
fun main() {
val e = Email("alex@x.com")
val u = User("Alex", 30)
println(e)
println(u)
}Expected output
alex@x.com User(name=Alex, age=30)
Questions and answers
Review the lesson questions together with their answers. To test yourself, solve the lesson interactively.
1 Match value vs data class
| Term | Meaning |
|---|---|
value class |
Single field, zero cost |
data class |
Many fields, methods |
@JvmInline |
Value class |
copy() |
Data class |
2 Complete the Email wrapper
@JvmInline
____ class Email(val address: String)
@JvmInline
value class Email(val address: String)
Explanation: value class Email is a single-field wrapper.
3 When is value class preferred over data class?
- When multiple fields are needed
- When equals/hashCode are needed
- When a single field and type safety are needed Correct answer
- When copy is needed
Explanation: A single field and type safety suit a value class.