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
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 — 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 class | Pembuatan otomatis equals, hashCode, toString, copy | Model data, DTO, Entity |
| sealed class | Hierarki terbatas, pemeriksaan when | Status, Hasil, UI State |
| sealed interface | sealed class + pewarisan berganda | Acara, Tindakan (Kotlin 1.9+) |
| object | Singleton (deklaratif) | Factory, Utility, Konstanta |
| companion object | Anggota statis kelas | Factory Method, konstanta statis |
| enum class | Enumerasi dengan konstanta | Status 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 — 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).
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.
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 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 — 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 — 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.
// 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.
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.
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 |
|---|---|---|
| reified | Mempertahankan tipe generik di inline | inline fun <reified T> parse(): T |
| destructuring | Membongkar data class | val (name, age) = person |
| typealias | Alias tipe | typealias Orders = List<Order> |
| lateinit | Inisialisasi var ditunda | lateinit var adapter: Adapter |
| lazy | Inisialisasi lazy val | val config by lazy { load() } |
| delegated | Delegasi properti | var 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 — 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).
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
}
}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.
@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
data class — untuk data (pembuatan otomatis equals/hashCode/copy). sealed class — untuk hierarki tipe (pemeriksaan di when). sealed interface — sama dengan pewarisan berganda.
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.
CoroutineScope — ruang lingkup coroutine. lifecycleScope — untuk Activity, viewModelScope — untuk ViewModel. GlobalScope — tidak direkomendasikan.
reified — pelestarian tipe dalam fungsi inline. Memungkinkan T::class dan is T. Hanya bekerja dengan fungsi inline.
launch — tanpa hasil. async — dengan hasil (Deferred). runBlocking — jembatan pemblokiran untuk main/test. withContext — mengganti Dispatcher.
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.