0Pricing
Android Academy · Pelajaran

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 nilai
  • hashCode() — hash konsisten berdasarkan properti
  • toString() — representasi string yang mudah dibaca
  • copy() — 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, when yang 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

  1. Keamanan Nilai Null
  2. Kelas & Objek
  3. Kelas Data & Kelas Sealed
  4. Fungsi Ekstensi & Fungsi Orde Tinggi
← Kembali ke Android Academy