Spesifikasi Kotlin dalam pengembangan mobile: apa itu, konstruksi apa dan cara kerjanya

Penulis: IT Sectr Diterbitkan: 2026-06-29 Waktu membaca: 11 mnt

Kotlin adalah bahasa utama untuk pengembangan Android. Menurut Google Android Docs (2025), lebih dari 95% proyek Android baru menggunakan Kotlin. Memahami spesifikasi Kotlin — data class, sealed class, coroutine dan scope functions — adalah persyaratan wajib bagi pengembang Android.

Poin Penting

  • data class — pembuatan otomatis equals/hashCode/toString/copy/componentN. Untuk model data. sealed class — hierarki tipe terbatas dengan pemeriksaan when.
  • Scope functions: let, run, with, apply, also. Berbeda berdasarkan konteks (it vs this) dan nilai kembali.
  • Coroutine: launch (fire-and-forget), async (dengan hasil), runBlocking (jembatan), withContext (mengganti Dispatcher).
  • lifecycleScope dan viewModelScope — Coroutine Lifecycle-aware tanpa pembatalan manual.
  • reified — pelestarian tipe dalam fungsi inline. lateinit/lazy — inisialisasi ditunda.

Kelas (data class, sealed class, object, companion object)

Kotlin memperluas konsep kelas dari Java. data class, sealed class, object dan companion object — konstruksi yang tidak ada di Java atau diimplementasikan secara berbeda.

data class vs sealed class

data class — kelas yang secara otomatis menghasilkan equals(), hashCode(), toString(), copy() dan componentN(). Ideal untuk model data (DTO, Entity). Persyaratan: setidaknya satu parameter di konstruktor utama, val/var, tidak boleh open/sealed/inner. sealed class — kelas dengan hierarki subkelas terbatas. Semua subkelas diketahui saat kompilasi dan dideklarasikan di file yang sama. Ekspresi when dengan sealed class tidak memerlukan cabang else. sealed interface (Kotlin 1.9+) — sama dengan sealed class tetapi memungkinkan pewarisan berganda. object — singleton, dideklarasikan dengan kata kunci object (bukan class). Inisialisasi lazy thread-safe. companion object — anggota statis dari sebuah kelas. Memiliki nama (standarnya Companion). Dapat mengimplementasikan antarmuka dan memiliki extension functions.

Tipe Deskripsi Penggunaan
data classPembuatan otomatis equals, hashCode, toString, copyModel data, DTO, Entity
sealed classHierarki terbatas, pemeriksaan whenStatus, Hasil, UI State
sealed interfacesealed class + pewarisan bergandaAcara, Tindakan (Kotlin 1.9+)
objectSingleton (deklaratif)Factory, Utility, Konstanta
companion objectAnggota statis kelasFactory Method, konstanta statis
enum classEnumerasi dengan konstantaStatus dengan set tetap

data class — untuk 90% model. sealed class — untuk UI State dan Hasil. object — untuk singleton. IT Sectr merekomendasikan sealed class untuk semua status layar (Loading, Success, Error).

Sealed class dalam praktik

Sealed class — alat yang kuat untuk memodelkan status. Contoh: UiState<T> dengan subkelas Loading, Success(data: T), Error(message: String). Ekspresi when menjamin penanganan semua status. Sealed interface — untuk acara dan tindakan di mana implementasi berganda diperlukan. Value class (Kotlin 1.5+) — pembungkus untuk satu nilai tanpa overhead. Digunakan untuk pengidentifikasi type-safe: @JvmInline value class UserId(val id: String).

Fungsi (extension, inline, higher-order, scope functions)

Extension Function — menambahkan metode ke kelas yang ada tanpa pewarisan. fun String.isEmail(): Boolean. Extension Property — sama untuk properti (tanpa backing field). Inline Function — menyisipkan badan fungsi di tempat panggilan — tanpa overhead panggilan. Digunakan untuk higher-order functions dengan lambda. Higher-Order Function — fungsi yang menerima atau mengembalikan fungsi lain. Scope Functions — lima fungsi untuk bekerja dengan konteks objek: let, run, with, apply, also.

Scope Functions

let — konteks it, mengembalikan hasil lambda. Digunakan untuk panggilan null-safe (?.let {}). apply — konteks this, mengembalikan konteks. Untuk konfigurasi objek. run — konteks this, mengembalikan hasil lambda. Untuk perhitungan dengan konteks. also — konteks it, mengembalikan konteks. Untuk efek samping (pencatatan). with — bukan extension, konteks this, mengembalikan hasil lambda. Untuk grup operasi pada objek. Lambda — fungsi anonim. Destructuring Declaration — membongkar data class menjadi variabel: val (name, age) = person.

Inline + reified

Inline function dengan reified — satu-satunya cara untuk mempertahankan tipe generik di JVM. Digunakan untuk: builder type-safe (Gson.fromJson<T>()), pemeriksaan tipe (is T), mendapatkan kelas (T::class). Crossinline dan Noinline — pengubah untuk parameter lambda dalam fungsi inline. crossinline — melarang non-local return, noinline — melarang inlining lambda tertentu. IT Sectr merekomendasikan inline + reified hanya saat bekerja dengan tipe; untuk higher-order functions biasa, inline dapat meningkatkan ukuran bytecode.

Coroutine (Coroutine Builder, Dispatchers, Scope)

Coroutine — thread ringan untuk pemrograman asinkron. Tidak memblokir thread — menangguhkan (suspend). suspend function — fungsi yang dapat ditangguhkan tanpa memblokir thread. Hanya dapat dipanggil dari coroutine atau suspend function lain.

CoroutineScope

CoroutineScope — ruang lingkup untuk coroutine. Berisi CoroutineContext (Job + Dispatcher). lifecycleScope — untuk Activity/Fragment (Lifecycle-aware). viewModelScope — untuk ViewModel (pembatalan otomatis saat onCleared()). GlobalScope — ruang lingkup global (jangan gunakan di produksi — kebocoran memori). Dispatchers: Dispatchers.Main (UI), Dispatchers.IO (jaringan/disk), Dispatchers.Default (CPU-intensif), Dispatchers.Unconfined (tidak direkomendasikan). launch — memulai coroutine: Job. async — memulai dengan hasil: Deferred<T>. runBlocking — jembatan pemblokiran. withContext — mengganti Dispatcher di dalam suspend function.

kotlin
// Contoh coroutine: memuat data di ViewModel
class MainViewModel : ViewModel() {
    private val _state = MutableStateFlow<UiState>(UiState.Loading)
    val state: StateFlow<UiState> = _state.asStateFlow()

    fun loadData() {
        viewModelScope.launch {
            _state.value = UiState.Loading
            try {
                val data = withContext(Dispatchers.IO) {
                    repository.fetchData()
                }
                _state.value = UiState.Success(data)
            } catch (e: Exception) {
                _state.value = UiState.Error(e.message)
            }
        }
    }
}

// Permintaan paralel dengan async
suspend fun loadCombinedData(): CombinedData = coroutineScope {
    val users = async(Dispatchers.IO) { api.getUsers() }
    val posts = async(Dispatchers.IO) { api.getPosts() }
    CombinedData(users.await(), posts.await())
}

viewModelScope.launch — peluncuran coroutine standar di ViewModel. withContext(Dispatchers.IO) — beralih ke thread IO untuk permintaan jaringan. Dispatchers menentukan di thread pool mana coroutine dijalankan. IT Sectr merekomendasikan viewModelScope untuk ViewModel dan lifecycleScope untuk Activity/Fragment.

Fitur lanjutan (reified, destructuring, lateinit/lazy)

reified — pengubah tipe dalam fungsi inline. Memungkinkan penggunaan tipe: T::class, is T, as T. Tanpa reified, generik di JVM dihapus (type erasure). inline fun + reified — kombinasi kuat untuk API type-safe. Destructuring Declaration — val (x, y) = point. Berfungsi untuk data class dan tipe dengan componentN(). typealias — alias tipe: typealias Callback = (String) -> Unit. lateinit — inisialisasi var ditunda (untuk dependency injection). Tidak thread-safe. lazy — inisialisasi lazy val (standar thread-safe). lazy(LazyThreadSafetyMode.NONE) — tanpa sinkronisasi. Extension function dan Extension property — menambahkan fungsionalitas tanpa pewarisan. Kotlin adalah bahasa di mana extension functions menyelesaikan 90% tugas utilitas.

Properti Delegasi

Delegated Properties — mendelegasikan getter/setter ke objek lain. Delegasi standar: lazy, observable, vetoable, map. Delegasi kustom melalui operator getValue/setValue. by — kata kunci delegasi: val name by lazy { loadName() }. Properti delegasi adalah dasar untuk delegasi ViewModel (by viewModels()). IT Sectr merekomendasikan lazy untuk inisialisasi ditunda dan Delegates.observable untuk mengamati perubahan.

Fitur Deskripsi Contoh
reifiedMempertahankan tipe generik di inlineinline fun <reified T> parse(): T
destructuringMembongkar data classval (name, age) = person
typealiasAlias tipetypealias Orders = List<Order>
lateinitInisialisasi var ditundalateinit var adapter: Adapter
lazyInisialisasi lazy valval config by lazy { load() }
delegatedDelegasi propertivar x by Delegates.observable(0)

reified — untuk API type-safe. lazy — untuk pemuatan ditunda. delegated properties — untuk menggunakan kembali logika properti. IT Sectr merekomendasikan menguasai semua fitur ini untuk pengembangan Kotlin yang efektif.

Flow dan StateFlow

Flow — aliran data asinkron dingin di Kotlin. Mengeluarkan nilai berdasarkan permintaan kolektor. StateFlow — Flow panas dengan satu nilai saat ini. Digunakan di ViewModel untuk UI State. SharedFlow — Flow panas untuk acara (acara satu kali). flowOf, asFlow — membuat Flow dari koleksi. catch, retry, debounce — operator. stateIn, shareIn — konversi Flow dingin ke panas. IT Sectr merekomendasikan StateFlow untuk UI State dan SharedFlow untuk acara (Snackbar, navigasi).

kotlin
class SearchViewModel : ViewModel() {
    private val _query = MutableStateFlow("")
    val suggestions: StateFlow<List<String>> = _query
        .debounce(300)
        .filter { it.length >= 2 }
        .flatMapLatest { repository.search(it) }
        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())

    fun onQueryChanged(query: String) {
        _query.value = query
    }
}

Serialisasi (kotlinx.serialization, Parcelize)

kotlinx.serialization — pustaka Kotlin untuk serialisasi JSON. @Serializable — anotasi. @SerialName — nama bidang kustom. Mendukung: JSON, CBOR, ProtoBuf. Parcelize — @Parcelize untuk Android Parcelable (tanpa implementasi manual). Gson vs Moshi vs kotlinx: kotlinx.serialization — Kotlin-first, aman kompilasi, tanpa refleksi. Moshi — anotasi + codegen. IT Sectr merekomendasikan kotlinx.serialization untuk proyek baru dan Moshi untuk yang sudah ada.

kotlin
@Serializable
data class ApiResponse<T>(
    val success: Boolean,
    @SerialName("data") val data: T? = null,
    val error: String? = null
)

@Serializable
data class User(
    val id: Int,
    val name: String,
    val email: String
)

// Deserialisasi
val json = Json { ignoreUnknownKeys = true }
val response = json.decodeFromString<ApiResponse<List<User>>>(jsonString)
println("Users: ${response.data?.size ?: 0}")

Pertanyaan Umum

Apa perbedaan antara data class dan sealed class?

data class — untuk data (pembuatan otomatis equals/hashCode/copy). sealed class — untuk hierarki tipe (pemeriksaan di when). sealed interface — sama dengan pewarisan berganda.

Apa itu scope functions di Kotlin?

let, run, with, apply, also. Berbeda berdasarkan konteks (it vs this) dan nilai kembali (result vs context). let — null safety, apply — konfigurasi, also — efek samping.

Apa itu CoroutineScope dan tipe apa saja yang ada?

CoroutineScope — ruang lingkup coroutine. lifecycleScope — untuk Activity, viewModelScope — untuk ViewModel. GlobalScope — tidak direkomendasikan.

Apa itu reified di Kotlin?

reified — pelestarian tipe dalam fungsi inline. Memungkinkan T::class dan is T. Hanya bekerja dengan fungsi inline.

Apa itu coroutine builders: launch, async, runBlocking?

launch — tanpa hasil. async — dengan hasil (Deferred). runBlocking — jembatan pemblokiran untuk main/test. withContext — mengganti Dispatcher.

Ringkasan

  • data class — untuk model. sealed class — untuk status. object — untuk singleton.
  • Scope functions: let (null-safe), apply (konfigurasi), run (perhitungan), also (pencatatan).
  • Coroutine: launch (fire-and-forget), async (dengan hasil), withContext (ganti Dispatcher).
  • viewModelScope — standar untuk ViewModel. lifecycleScope — untuk Activity/Fragment.
  • reified — fungsi inline type-safe. lateinit — DI, lazy — inisialisasi lazy.
  • Extension functions — tambahkan fungsionalitas tanpa pewarisan.
  • Dispatchers: Main (UI), IO (jaringan/disk), Default (CPU). Pilih yang tepat.

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.

Diskusikan proyek