Kotlin
value class vs data class
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).
Exercise 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).
Show example 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)
}
Test yourself
-
Match value vs data class
- value class
- Single field, zero cost
- data class
- Many fields, methods
- @JvmInline
- Value class
- copy()
- Data class
-
Complete the Email wrapper
@JvmInline
____ class Email(val address: String)
Show answer
@JvmInline
value class Email(val address: String)
-
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
- When copy is needed
Show answer
When a single field and type safety are needed — A single field and type safety suit a value class.
Next lesson: Summary - Value class