Ang Kotlin ay ang pangunahing wika para sa Android development. Ayon sa Google Android Docs (2025), mahigit 95% ng mga bagong Android project ay gumagamit ng Kotlin. Ang pag-unawa sa mga espesyalidad ng Kotlin — data class, sealed class, coroutines at scope functions — ay isang mandatoryong kinakailangan para sa isang Android developer.
Mga Pangunahing Punto
Kotlin ay nagpapalawak ng mga konsepto ng klase mula sa Java. data class, sealed class, object at companion object — mga konstruksyon na wala sa Java o iba ang implementasyon.
data class — isang klase na awtomatikong bumubuo ng equals(), hashCode(), toString(), copy() at componentN(). Mainam para sa mga data model (DTO, Entity). Mga kinakailangan: kahit isang parameter sa primary constructor, val/var, hindi maaaring open/sealed/inner. sealed class — isang klase na may limitadong hierarchy ng subclass. Lahat ng subclass ay alam sa oras ng kompilasyon at idineklara sa parehong file. Ang expression na when na may sealed class ay hindi nangangailangan ng else branch. sealed interface (Kotlin 1.9+) — kapareho ng sealed class ngunit pinapayagan ang maramihang mana. object — singleton, idineklara gamit ang keyword na object (hindi class). Thread-safe na lazy initialization. companion object — mga static na miyembro ng isang klase. May pangalan (default ay Companion). Maaaring mag-implement ng mga interface at magkaroon ng extension functions.
| Uri | Paglalarawan | Gamit |
|---|---|---|
| data class | Awtomatikong pagbuo ng equals, hashCode, toString, copy | Mga data model, DTO, Entity |
| sealed class | Limitadong hierarchy, pagsusuri ng when | Mga estado, Resulta, UI State |
| sealed interface | sealed class + maramihang mana | Mga event, Aksyon (Kotlin 1.9+) |
| object | Singleton (deklaratibo) | Factory, Utility, Mga constante |
| companion object | Mga static na miyembro ng klase | Factory Method, static na constante |
| enum class | Enumeration na may constante | Mga estado na may takdang set |
data class — para sa 90% ng mga modelo. sealed class — para sa UI State at Resulta. object — para sa mga singleton. Inirerekomenda ng IT Sectr ang sealed class para sa lahat ng estado ng screen (Loading, Success, Error).
Sealed class — isang makapangyarihang tool para sa pagmomodelo ng mga estado. Halimbawa: UiState<T> na may mga subclass na Loading, Success(data: T), Error(message: String). Ginagarantiyahan ng expression na when ang paghawak sa lahat ng estado. Sealed interface — para sa mga event at aksyon kung saan kailangan ang maramihang implementasyon. Value class (Kotlin 1.5+) — isang wrapper para sa iisang halaga nang walang overhead. Ginagamit para sa type-safe na mga identifier: @JvmInline value class UserId(val id: String).
Extension Function — pagdaragdag ng method sa umiiral na klase nang walang mana. fun String.isEmail(): Boolean. Extension Property — pareho para sa mga property (walang backing field). Inline Function — pagpasok ng body ng function sa lugar ng tawag — walang overhead ng tawag. Ginagamit para sa higher-order function na may lambda. Higher-Order Function — isang function na tumatanggap o nagbabalik ng ibang function. Scope Functions — limang function para sa pagtatrabaho sa konteksto ng object: let, run, with, apply, also.
let — konteksto it, nagbabalik ng resulta ng lambda. Ginagamit para sa null-safe na tawag (?.let {}). apply — konteksto this, nagbabalik ng konteksto. Para sa pagsasaayos ng object. run — konteksto this, nagbabalik ng resulta ng lambda. Para sa pagkalkula na may konteksto. also — konteksto it, nagbabalik ng konteksto. Para sa side effects (pag-log). with — hindi extension, konteksto this, nagbabalik ng resulta ng lambda. Para sa grupo ng mga operasyon sa isang object. Lambda — anonymous function. Destructuring Declaration — pag-unpack ng data class sa mga variable: val (name, age) = person.
Inline function na may reified — ang tanging paraan upang mapanatili ang generic type sa JVM. Ginagamit para sa: type-safe builder (Gson.fromJson<T>()), pagsusuri ng uri (is T), pagkuha ng klase (T::class). Crossinline at Noinline — mga modifier para sa lambda parameter sa inline function. crossinline — nagbabawal ng non-local return, noinline — nagbabawal ng inlining ng partikular na lambda. Inirerekomenda ng IT Sectr ang inline + reified lamang kapag nagtatrabaho sa mga uri; para sa ordinaryong higher-order function, ang inline ay maaaring magpataas ng laki ng bytecode.
Coroutines — magaang na thread para sa asynchronous programming. Hindi hinaharangan ang thread — nagsususpend. suspend function — isang function na maaaring isuspend nang hindi hinaharangan ang thread. Maaari lamang tawagin mula sa isang coroutine o ibang suspend function.
CoroutineScope — isang saklaw para sa coroutines. Naglalaman ng CoroutineContext (Job + Dispatcher). lifecycleScope — para sa Activity/Fragment (Lifecycle-aware). viewModelScope — para sa ViewModel (awtomatikong pagkansela sa onCleared()). GlobalScope — pandaigdigang saklaw (huwag gamitin sa produksyon — pagtagas ng memorya). Dispatchers: Dispatchers.Main (UI), Dispatchers.IO (network/disk), Dispatchers.Default (CPU-intensive), Dispatchers.Unconfined (hindi inirerekomenda). launch — magsimula ng coroutine: Job. async — magsimula na may resulta: Deferred<T>. runBlocking — humaharang na tulay. withContext — nagpapalit ng Dispatcher sa loob ng suspend function.
// Halimbawa coroutines: pagkarga ng data sa 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)
}
}
}
}
// Parallel na kahilingan gamit ang 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 — karaniwang paglulunsad ng coroutine sa ViewModel. withContext(Dispatchers.IO) — paglipat sa IO thread para sa kahilingan sa network. Dispatchers ay tumutukoy kung saang thread pool isinasagawa ang coroutine. Inirerekomenda ng IT Sectr ang viewModelScope para sa ViewModel at lifecycleScope para sa Activity/Fragment.
reified — isang modifier ng uri sa inline function. Pinapayagan ang paggamit ng uri: T::class, is T, as T. Kung walang reified, ang generics sa JVM ay nabubura (type erasure). inline fun + reified — isang malakas na kombinasyon para sa type-safe API. Destructuring Declaration — val (x, y) = point. Gumagana para sa data class at mga uri na may componentN(). typealias — alias ng uri: typealias Callback = (String) -> Unit. lateinit — naantalang pagsisimula ng var (para sa dependency injection). Hindi thread-safe. lazy — lazy na pagsisimula ng val (default ay thread-safe). lazy(LazyThreadSafetyMode.NONE) — walang synchronization. Extension function at Extension property — pagdaragdag ng functionality nang walang mana. Ang Kotlin ay isang wika kung saan ang extension functions ay lumulutas ng 90% ng mga gawaing utility.
Delegated Properties — pag-delegate ng getter/setter sa ibang object. Mga karaniwang delegado: lazy, observable, vetoable, map. Custom na delegado sa pamamagitan ng getValue/setValue operator. by — keyword ng delegasyon: val name by lazy { loadName() }. Ang mga delegadong property ay pundasyon para sa ViewModel delegado (by viewModels()). Inirerekomenda ng IT Sectr ang lazy para sa naantalang pagsisimula at Delegates.observable para sa pagmamasid ng mga pagbabago.
| Tampok | Paglalarawan | Halimbawa |
|---|---|---|
| reified | Pagpapanatili ng generic type sa inline | inline fun <reified T> parse(): T |
| destructuring | Pag-unpack ng data class | val (name, age) = person |
| typealias | Alias ng uri | typealias Orders = List<Order> |
| lateinit | Naantalang pagsisimula ng var | lateinit var adapter: Adapter |
| lazy | Lazy na pagsisimula ng val | val config by lazy { load() } |
| delegated | Delegasyon ng property | var x by Delegates.observable(0) |
reified — para sa type-safe API. lazy — para sa naantalang pag-load. delegated properties — para sa muling paggamit ng lohika ng property. Inirerekomenda ng IT Sectr na master ang lahat ng tampok na ito para sa epektibong pag-develop ng Kotlin.
Flow — malamig na asynchronous data stream sa Kotlin. Naglalabas ng mga halaga ayon sa kahilingan ng collector. StateFlow — mainit na Flow na may iisang kasalukuyang halaga. Ginagamit sa ViewModel para sa UI State. SharedFlow — mainit na Flow para sa mga event (isang beses na event). flowOf, asFlow — paggawa ng Flow mula sa mga koleksyon. catch, retry, debounce — mga operator. stateIn, shareIn — conversion ng malamig na Flow sa mainit. Inirerekomenda ng IT Sectr ang StateFlow para sa UI State at SharedFlow para sa mga event (Snackbar, navigation).
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 — library ng Kotlin para sa JSON serialization. @Serializable — anotasyon. @SerialName — custom na pangalan ng field. Sumusuporta: JSON, CBOR, ProtoBuf. Parcelize — @Parcelize para sa Android Parcelable (nang walang manual na implementasyon). Gson vs Moshi vs kotlinx: kotlinx.serialization — Kotlin-first, compile-safe, walang reflection. Moshi — anotasyon + codegen. Inirerekomenda ng IT Sectr ang kotlinx.serialization para sa mga bagong proyekto at Moshi para sa umiiral na.
@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
)
// Deserialization
val json = Json { ignoreUnknownKeys = true }
val response = json.decodeFromString<ApiResponse<List<User>>>(jsonString)
println("Users: ${response.data?.size ?: 0}")Mga Madalas Itanong
data class — para sa data (awtomatikong pagbuo ng equals/hashCode/copy). sealed class — para sa hierarchy ng uri (pagsusuri sa when). sealed interface — pareho na may maramihang mana.
let, run, with, apply, also. Nagkakaiba ayon sa konteksto (it vs this) at return value (result vs context). let — null safety, apply — pagsasaayos, also — side effects.
CoroutineScope — isang saklaw para sa coroutines. lifecycleScope — para sa Activity, viewModelScope — para sa ViewModel. GlobalScope — hindi inirerekomenda.
reified — pagpapanatili ng uri sa inline function. Pinapayagan ang T::class at is T. Gumagana lamang sa inline function.
launch — walang resulta. async — may resulta (Deferred). runBlocking — humaharang na tulay para sa main/test. withContext — pagpapalit ng Dispatcher.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.