data class di Kotlin adalah tipe kelas khusus yang dirancang semata-mata untuk menyimpan data. Compiler secara otomatis menghasilkan metode equals, hashCode, toString, copy dan componentN berdasarkan properti yang ditentukan di primary constructor. Menurut dokumentasi JetBrains (2026), data class memungkinkan pengurangan volume kode boilerplate sebesar 50–70% dibandingkan dengan padanan Java dan menjadi dasar untuk value-objek di proyek Kotlin.
Poin utama
data class adalah konstruksi sintaksis Kotlin yang secara otomatis menghasilkan metode standar untuk kelas yang tujuan utamanya adalah menyimpan data. Saat mendeklarasikan data class, compiler membuat implementasi equals, hashCode, toString, copy dan componentN berdasarkan semua properti dari primary constructor.
Tidak seperti kelas biasa di Java, di mana pengembang harus menulis getter, setter, equals, hashCode dan toString secara manual menggunakan IDE atau pustaka seperti Lombok, Kotlin menyediakan mekanisme built-in. Ini tidak hanya mempersingkat kode, tetapi juga menjamin konsistensi — metode otomatis selalu sesuai dengan struktur properti saat ini.
Menurut data JetBrains Kotlin Survey (2025), data class digunakan di 78% proyek Kotlin, menjadikannya salah satu fitur bahasa yang paling banyak dicari. Ini sangat populer dalam arsitektur dengan DTO, model respons API, dan objek status di MVVM.
data class dideklarasikan dengan kata kunci data sebelum class. Semua properti yang berpartisipasi dalam metode otomatis ditentukan di primary constructor.
data class User(
val id: Int,
val name: String,
val email: String
)
Satu baris kode menggantikan puluhan baris boilerplate di Java. Compiler menghasilkan equals, hashCode, toString, copy dan component1–component3 untuk ketiga properti.
Metode otomatis hanya mencakup properti dari primary constructor. Jika Anda mendeklarasikan properti di body kelas, properti tersebut tidak berpartisipasi dalam equals, hashCode, toString dan copy.
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice TIDAK termasuk dalam equals/hashCode/copy
}
Primary constructor data class harus mengandung setidaknya satu parameter. Semua parameter harus ditandai dengan val atau var. Modifier open, abstract, sealed atau inner tidak dapat digunakan untuk data class.
equals dan hashCode dihasilkan berdasarkan nilai semua properti dari primary constructor. Dua instance data class dianggap sama jika semua properti yang sesuai sama.
Di Java, perbandingan objek default adalah perbandingan referensi (==). Untuk perbandingan berdasarkan nilai diperlukan override equals. Kotlin data class melakukan ini secara otomatis, memungkinkan penggunaan == untuk perbandingan struktural.
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // benar
Metode toString mengembalikan representasi objek yang dapat dibaca dengan nama dan nilai semua properti. Ini secara signifikan menyederhanakan logging dan debugging dibandingkan dengan Java, di mana secara default kode hash ditampilkan dalam format heksadesimal.
Menurut Kotlin Documentation (2026), format toString data class adalah: “User(id=1, name=John, email=john@example.com)”. Saat properti dihapus dari primary constructor, toString diperbarui secara otomatis — risiko desinkronisasi dihilangkan.
copy — salah satu kemampuan kunci data class. Membuat salinan dangkal objek dengan kemampuan mengubah nilai properti yang ditentukan.
data class Order(
val id: Long,
val status: String,
val amount: Double
)
val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = “Confirmed”
copy sangat diperlukan dalam gaya fungsional dan arsitektur dengan ketidakberubahan (immutability). Alih-alih mutasi objek yang ada, salinan baru dengan bidang yang diubah dibuat, yang membuat kode lebih dapat diprediksi dan aman dalam skenario multithread.
data class secara otomatis menghasilkan fungsi component1, component2 dan seterusnya untuk setiap properti sesuai urutan deklarasinya. Ini memungkinkan destrukturisasi objek menjadi variabel.
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)") // “1: Alice (alice@example.com)”
Destrukturisasi juga berfungsi dalam lambda dan loop for-each, yang membuat data class nyaman untuk bekerja dengan koleksi.
Pertama — data class tidak mendukung pewarisan dari data class lain. Hanya dapat mewarisi dari kelas biasa atau antarmuka.
Kedua — metode otomatis hanya mencakup properti primary constructor. Properti di body kelas diabaikan, yang dapat menyebabkan equals tidak benar jika Anda lupa hal ini.
Ketiga — data class tidak bisa open, abstract, sealed atau inner. Selalu final.
Keempat — untuk koleksi di dalam data class, copy melakukan penyalinan dangkal. Perubahan elemen dalam koleksi yang disalin akan memengaruhi aslinya.
Menurut Kotlin Best Practices (2026), data class optimal untuk DTO, model API, value objects dan objek status. Untuk komponen dengan logika bisnis, disarankan menggunakan kelas biasa.
Pertanyaan yang sering diajukan
Tidak, data class tidak dapat mewarisi data class lain. Namun dapat mewarisi kelas biasa atau mengimplementasikan antarmuka.
Setidaknya satu properti. Jumlah maksimum tidak dibatasi, tetapi untuk destrukturisasi dihasilkan hingga componentN.
Tidak, metode otomatis hanya mempertimbangkan properti dari primary constructor. Properti dari body kelas tidak berpartisipasi dalam equals, hashCode, toString dan copy.
Ya, Anda dapat meng-override equals, hashCode atau toString di body data class. Dalam hal ini, compiler tidak menghasilkan implementasinya sendiri.
data class secara otomatis menghasilkan equals, hashCode, toString, copy dan componentN. Kelas biasa tidak menyediakan metode ini tanpa implementasi manual.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga