Kelas Data & Kelas Sealed
Gunakan kelas data untuk kesetaraan berbasis nilai dan copy(), serta kelas sealed untuk hierarki tipe yang lengkap dan pemodelan status yang rapi.
Kelas Data & Kelas Sealed adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 4 pelajaran total.
Apa Itu Data Class?
Data class dalam Kotlin adalah class yang tujuan utamanya menyimpan data. Kompilator secara otomatis membuat metode-metode yang berguna untuk Anda:
equals()— membandingkan dua instance berdasarkan nilaihashCode()— hash konsisten berdasarkan propertitoString()— representasi string yang mudah dibacacopy()— membuat salinan yang telah dimodifikasi- Dukungan destrukturisasi
Mendeklarasikan Kelas Data
Tambahkan kata kunci data sebelum class. Semua properti harus berada di konstruktor utama:
data class User(val id: Int, val name: String, val email: String)
fun main() {
val u1 = User(1, "Alice", "alice@example.com")
val u2 = User(1, "Alice", "alice@example.com")
println(u1) // User(id=1, name=Alice, email=alice@example.com)
println(u1 == u2) // true (value equality)
println(u1 === u2) // false (different objects)
}copy() — Mengubah Satu Bidang
copy() membuat instans baru dengan beberapa properti yang diubah. Instans asli tidak diubah (kekekalan):
data class Product(val name: String, val price: Double, val inStock: Boolean)
fun main() {
val original = Product("Laptop", 999.0, true)
// Only change the price; keep everything else
val onSale = original.copy(price = 799.0)
println(original) // Product(name=Laptop, price=999.0, inStock=true)
println(onSale) // Product(name=Laptop, price=799.0, inStock=true)
}Deklarasi Destrukturisasi
Kelas data mendukung destrukturisasi — membongkar properti menjadi variabel menggunakan fungsi componentN() yang dibuat oleh kompilator:
data class Point(val x: Int, val y: Int)
fun main() {
val point = Point(10, 20)
// Destructure into separate variables
val (x, y) = point
println("x=$x, y=$y") // x=10, y=20
// Also works in for loops with maps
val scores = mapOf("Alice" to 95, "Bob" to 88)
for ((name, score) in scores) {
println("$name: $score")
}
}Apa Itu Kelas Tersegel?
Kelas tersegel adalah hierarki kelas yang dibatasi — semua subkelas harus didefinisikan dalam file yang sama. Dengan demikian, kumpulan jenis yang mungkin diketahui saat kompilasi.
Gunakan kelas tersegel untuk merepresentasikan kumpulan keadaan yang terbatas, seperti hasil jaringan, keadaan antarmuka pengguna, atau peristiwa navigasi.
Sintaks Kelas Tersegel
Deklarasikan subkelas secara langsung di dalam kelas atau di file yang sama:
sealed class NetworkResult<out T> {
data class Success<T>(val data: T) : NetworkResult<T>()
data class Error(val message: String, val code: Int = 0) : NetworkResult<Nothing>()
object Loading : NetworkResult<Nothing>()
}
fun handle(result: NetworkResult<String>) {
when (result) {
is NetworkResult.Success -> println("Data: ${result.data}")
is NetworkResult.Error -> println("Error ${result.code}: ${result.message}")
NetworkResult.Loading -> println("Loading...")
}
}Kelas Tersegel + when (Lengkap)
Inilah keunggulan kelas tersegel: when bersifat lengkap. Kompilator memaksa Anda menangani setiap subjenis — tidak ada kasus yang terlupakan:
sealed class UiState {
object Loading : UiState()
data class Success(val message: String) : UiState()
data class Error(val error: String) : UiState()
}
fun render(state: UiState): String = when (state) {
is UiState.Loading -> "Showing spinner"
is UiState.Success -> "Show: ${state.message}"
is UiState.Error -> "Error: ${state.error}"
// Compiler error if you remove any branch!
}
fun main() {
println(render(UiState.Loading))
println(render(UiState.Success("Loaded!")))
}Kelas Tersegel vs Enum
Keduanya merepresentasikan kumpulan nilai yang tetap, tetapi:
- Enum — setiap konstanta adalah satu instans, tanpa data tambahan untuk setiap varian
- Kelas tersegel — setiap varian dapat membawa data yang berbeda dan dapat berupa kelas atau objek
Gunakan enum jika varian tidak memerlukan data. Gunakan kelas tersegel jika varian memerlukan properti yang berbeda.
Deklarasi Object (Singleton)
object membuat singleton — satu instans, dibuat secara lambat, dan aman untuk thread:
object AppConfig {
const val BASE_URL = "https://api.example.com"
const val TIMEOUT = 30L
fun buildUrl(path: String) = "$BASE_URL/$path"
}
fun main() {
println(AppConfig.BASE_URL) // https://api.example.com
println(AppConfig.buildUrl("users")) // https://api.example.com/users
}Object Pendamping
Object pendamping berada di dalam kelas dan menyediakan anggota tingkat kelas (seperti static milik Java). Biasanya digunakan untuk metode pabrik:
class Token private constructor(val value: String) {
companion object {
fun create(raw: String): Token {
val cleaned = raw.trim()
require(cleaned.isNotEmpty()) { "Token must not be blank" }
return Token(cleaned)
}
}
}
fun main() {
val token = Token.create(" abc123 ")
println(token.value) // abc123
}Kelas Data dalam Aplikasi Nyata
Gabungkan kelas data dengan kelas tersegel untuk pemodelan keadaan yang rapi:
data class Post(val id: Int, val title: String, val body: String)
sealed class PostState {
object Loading : PostState()
data class Loaded(val posts: List<Post>) : PostState()
data class Failed(val reason: String) : PostState()
}
fun showState(state: PostState) = when (state) {
PostState.Loading -> println("Fetching posts...")
is PostState.Loaded -> println("${state.posts.size} posts loaded")
is PostState.Failed -> println("Failed: ${state.reason}")
}
fun main() {
showState(PostState.Loaded(listOf(
Post(1, "Hello", "World"),
Post(2, "Kotlin", "Rocks")
)))
}Pemeriksaan Singkat
Pernyataan mana yang paling tepat menjelaskan perbedaan kelas tersegel dari kelas abstrak biasa?
Ringkasan: Kelas Data & Tersegel
Sekarang Anda memiliki dua alat Kotlin yang kuat:
- data class — kesetaraan berdasarkan nilai,
copy(), destrukturisasi,toString()yang dibuat otomatis - sealed class — hierarki jenis yang terbatas,
whenyang lengkap, setiap varian dapat membawa datanya sendiri - object — singleton, object pendamping untuk metode pabrik
Bersama-sama, pola ini menggantikan kode berulang Java dan memungkinkan pemodelan keadaan yang rapi serta aman.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Kelas Data & Kelas Sealed” gratis?
Ya — teks lengkap “Kelas Data & Kelas Sealed” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Kelas Data & Kelas Sealed”?
Gunakan kelas data untuk kesetaraan berbasis nilai dan copy(), serta kelas sealed untuk hierarki tipe yang lengkap dan pemodelan status yang rapi. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Android Academy?
Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Kelas Data & Kelas Sealed” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Keamanan Nilai Null
- Kelas & Objek
- Kelas Data & Kelas Sealed
- Fungsi Ekstensi & Fungsi Orde Tinggi