CodeBlanks Logo Icon CodeBlanks

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).

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

Main.kt
// 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

Main.kt
@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

Question
@JvmInline
____ class Email(val address: String)
Answer
@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.

All lessons in Intermediate