Kotlin হল Android ডেভেলপমেন্টের জন্য প্রাথমিক ভাষা। Google Android Docs (2025) অনুযায়ী, 95% এর বেশি নতুন Android প্রকল্প Kotlin ব্যবহার করে। Kotlin বিশেষত্ব বোঝা — data class, sealed class, coroutines এবং scope functions — একজন Android ডেভেলপারের জন্য বাধ্যতামূলক প্রয়োজনীয়তা।
মূল পয়েন্ট
Kotlin Java থেকে ক্লাস ধারণা সম্প্রসারিত করে। data class, sealed class, object এবং companion object — এমন কাঠামো যা Java এ নেই বা ভিন্নভাবে বাস্তবায়িত।
data class — একটি ক্লাস যা স্বয়ংক্রিয়ভাবে equals(), hashCode(), toString(), copy() এবং componentN() জেনারেট করে। ডেটা মডেল (DTO, Entity) এর জন্য আদর্শ। প্রয়োজনীয়তা: প্রাথমিক কনস্ট্রাক্টরে কমপক্ষে একটি প্যারামিটার, val/var, open/sealed/inner হতে পারে না। sealed class — সীমাবদ্ধ উপশ্রেণী হায়ারার্কি সহ একটি ক্লাস। সকল উপশ্রেণী কম্পাইল টাইমে জানা যায় এবং একই ফাইলে ঘোষিত হয়। sealed class সহ when এক্সপ্রেশনের else ব্রাঞ্চের প্রয়োজন হয় না। sealed interface (Kotlin 1.9+) — sealed class এর মতো কিন্তু একাধিক ইনহেরিটেন্স অনুমতি দেয়। object — সিঙ্গলটন, object কীওয়ার্ড দিয়ে ঘোষিত (class না)। থ্রেড-সেফ লেজি ইনিশিয়ালাইজেশন। companion object — ক্লাসের স্ট্যাটিক সদস্য। এর একটি নাম থাকে (ডিফল্ট Companion)। ইন্টারফেস বাস্তবায়ন করতে পারে এবং extension functions থাকতে পারে।
| প্রকার | বিবরণ | ব্যবহার |
|---|---|---|
| data class | equals, hashCode, toString, copy এর স্বয়ংক্রিয় জেনারেশন | ডেটা মডেল, DTO, Entity |
| sealed class | সীমাবদ্ধ হায়ারার্কি, when চেক | অবস্থা, ফলাফল, UI State |
| sealed interface | sealed class + একাধিক ইনহেরিটেন্স | ইভেন্ট, অ্যাকশন (Kotlin 1.9+) |
| object | সিঙ্গলটন (ঘোষণামূলক) | Factory, Utility, ধ্রুবক |
| companion object | ক্লাসের স্ট্যাটিক সদস্য | Factory Method, স্ট্যাটিক ধ্রুবক |
| enum class | ধ্রুবক সহ গণনা | নির্দিষ্ট সেট সহ অবস্থা |
data class — 90% মডেলের জন্য। sealed class — UI State এবং ফলাফলের জন্য। object — সিঙ্গলটনের জন্য। IT Sectr সকল স্ক্রিন অবস্থার (Loading, Success, Error) জন্য sealed class সুপারিশ করে।
Sealed class — অবস্থা মডেলিংয়ের জন্য একটি শক্তিশালী টুল। উদাহরণ: UiState<T> উপশ্রেণী Loading, Success(data: T), Error(message: String) সহ। when এক্সপ্রেশন সকল অবস্থার হ্যান্ডলিং নিশ্চিত করে। Sealed interface — ইভেন্ট এবং অ্যাকশনের জন্য যেখানে একাধিক বাস্তবায়ন প্রয়োজন। Value class (Kotlin 1.5+) — ওভারহেড ছাড়া একটি মানের জন্য র্যাপার। টাইপ-সেফ আইডেন্টিফায়ারের জন্য ব্যবহৃত: @JvmInline value class UserId(val id: String).
Extension Function — ইনহেরিটেন্স ছাড়া বিদ্যমান ক্লাসে মেথড যোগ করা। fun String.isEmail(): Boolean. Extension Property — প্রপার্টির জন্য একই (ব্যাকিং ফিল্ড ছাড়া)। Inline Function — কল সাইটে ফাংশন বডি বসানো — কল ওভারহেড ছাড়া। ল্যাম্বডা সহ higher-order ফাংশনের জন্য ব্যবহৃত। Higher-Order Function — একটি ফাংশন যা অন্য ফাংশন গ্রহণ বা ফেরত দেয়। Scope Functions — অবজেক্ট প্রসঙ্গে কাজ করার জন্য পাঁচটি ফাংশন: let, run, with, apply, also.
let — প্রসঙ্গ it, ল্যাম্বডা ফলাফল ফেরত দেয়। null-safe কলের জন্য ব্যবহৃত (?.let {}). apply — প্রসঙ্গ this, প্রসঙ্গ ফেরত দেয়। অবজেক্ট কনফিগারেশনের জন্য। run — প্রসঙ্গ this, ল্যাম্বডা ফলাফল ফেরত দেয়। প্রসঙ্গ সহ গণনার জন্য। also — প্রসঙ্গ it, প্রসঙ্গ ফেরত দেয়। সাইড ইফেক্টের জন্য (লগিং)। with — extension নয়, প্রসঙ্গ this, ল্যাম্বডা ফলাফল ফেরত দেয়। একটি অবজেক্টের উপর অপারেশনের গ্রুপের জন্য। Lambda — বেনামী ফাংশন। Destructuring Declaration — data class কে ভেরিয়েবলে আনপ্যাক করা: val (name, age) = person.
Inline function reified সহ — JVM এ জেনেরিক টাইপ সংরক্ষণের একমাত্র উপায়। ব্যবহার: টাইপ-সেফ বিল্ডার (Gson.fromJson<T>()), টাইপ চেক (is T), ক্লাস পাওয়া (T::class). Crossinline এবং Noinline — inline ফাংশনে ল্যাম্বডা প্যারামিটারের জন্য সংশোধক। crossinline — non-local return নিষিদ্ধ করে, noinline — নির্দিষ্ট ল্যাম্বডার ইনলাইনিং নিষিদ্ধ করে। IT Sectr শুধুমাত্র টাইপ নিয়ে কাজ করার সময় inline + reified সুপারিশ করে; সাধারণ higher-order ফাংশনের জন্য, inline বাইটকোড আকার বাড়াতে পারে।
Coroutines — অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের জন্য হালকা থ্রেড। থ্রেড ব্লক করে না — সাসপেন্ড হয়। suspend function — একটি ফাংশন যা থ্রেড ব্লক না করে সাসপেন্ড হতে পারে। শুধুমাত্র coroutine বা অন্য suspend function থেকে কল করা যেতে পারে।
CoroutineScope — coroutines এর পরিধি। এতে CoroutineContext (Job + Dispatcher) থাকে। lifecycleScope — Activity/Fragment এর জন্য (Lifecycle-aware). viewModelScope — ViewModel এর জন্য (onCleared() এ স্বয়ংক্রিয় বাতিল). GlobalScope — গ্লোবাল পরিধি (প্রোডাকশনে ব্যবহার করবেন না — মেমরি লিক). Dispatchers: Dispatchers.Main (UI), Dispatchers.IO (নেটওয়ার্ক/ডিস্ক), Dispatchers.Default (CPU-intensive), Dispatchers.Unconfined (সুপারিশ করা হয় না). launch — coroutine শুরু: Job. async — ফলাফল সহ শুরু: Deferred<T>. runBlocking — ব্লকিং ব্রিজ. withContext — suspend ফাংশনের ভিতরে Dispatcher পরিবর্তন।
// ViewModel এ ডেটা লোড করার উদাহরণ coroutines
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)
}
}
}
}
// 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 — ViewModel এ স্ট্যান্ডার্ড coroutine লঞ্চ। withContext(Dispatchers.IO) — নেটওয়ার্ক অনুরোধের জন্য IO থ্রেডে সুইচ করা। Dispatchers নির্ধারণ করে কোন থ্রেড পুলে coroutine এক্সিকিউট হয়। IT Sectr ViewModel এর জন্য viewModelScope এবং Activity/Fragment এর জন্য lifecycleScope সুপারিশ করে।
reified — inline ফাংশনে টাইপ সংশোধক। টাইপ ব্যবহারের অনুমতি দেয়: T::class, is T, as T. reified ছাড়া, JVM এ জেনেরিক মুছে যায় (type erasure). inline fun + reified — টাইপ-সেফ API এর জন্য শক্তিশালী সমন্বয়। Destructuring Declaration — val (x, y) = point. data class এবং componentN() যুক্ত টাইপের জন্য কাজ করে। typealias — টাইপ উপনাম: typealias Callback = (String) -> Unit. lateinit — var এর বিলম্বিত ইনিশিয়ালাইজেশন (dependency injection এর জন্য). থ্রেড-সেফ নয়। lazy — val এর লেজি ইনিশিয়ালাইজেশন (ডিফল্টভাবে থ্রেড-সেফ). lazy(LazyThreadSafetyMode.NONE) — সিঙ্ক্রোনাইজেশন ছাড়া। Extension function এবং Extension property — ইনহেরিটেন্স ছাড়া কার্যকারিতা যোগ করা। Kotlin এমন একটি ভাষা যেখানে extension functions 90% ইউটিলিটি কাজ সমাধান করে।
Delegated Properties — getter/setter অন্য অবজেক্টে অর্পণ করা। স্ট্যান্ডার্ড ডেলিগেট: lazy, observable, vetoable, map. getValue/setValue অপারেটরের মাধ্যমে কাস্টম ডেলিগেট। by — ডেলিগেশন কীওয়ার্ড: val name by lazy { loadName() }. ডেলিগেটেড প্রপার্টি ViewModel ডেলিগেট (by viewModels()) এর ভিত্তি। IT Sectr বিলম্বিত ইনিশিয়ালাইজেশনের জন্য lazy এবং পরিবর্তন পর্যবেক্ষণের জন্য Delegates.observable সুপারিশ করে।
| বৈশিষ্ট্য | বিবরণ | উদাহরণ |
|---|---|---|
| reified | inline এ জেনেরিক টাইপ সংরক্ষণ | inline fun <reified T> parse(): T |
| destructuring | data class আনপ্যাক করা | val (name, age) = person |
| typealias | টাইপ উপনাম | typealias Orders = List<Order> |
| lateinit | var এর বিলম্বিত ইনিশিয়ালাইজেশন | lateinit var adapter: Adapter |
| lazy | val এর লেজি ইনিশিয়ালাইজেশন | val config by lazy { load() } |
| delegated | প্রপার্টি ডেলিগেশন | var x by Delegates.observable(0) |
reified — টাইপ-সেফ API এর জন্য। lazy — বিলম্বিত লোডিংয়ের জন্য। delegated properties — প্রপার্টি লজিক পুনরায় ব্যবহারের জন্য। IT Sectr কার্যকর Kotlin ডেভেলপমেন্টের জন্য এই সমস্ত বৈশিষ্ট্য আয়ত্ত করার সুপারিশ করে।
Flow — Kotlin এ কোল্ড অ্যাসিনক্রোনাস ডেটা স্ট্রিম। কালেক্টরের চাহিদায় মান নির্গত করে। StateFlow — একক বর্তমান মান সহ হট Flow। ViewModel এ UI State এর জন্য ব্যবহৃত। SharedFlow — ইভেন্টের জন্য হট Flow (এক-শট ইভেন্ট). flowOf, asFlow — কালেকশন থেকে Flow তৈরি। catch, retry, debounce — অপারেটর। stateIn, shareIn — কোল্ড Flow কে হট এ রূপান্তর। IT Sectr UI State এর জন্য StateFlow এবং ইভেন্ট (Snackbar, নেভিগেশন) এর জন্য SharedFlow সুপারিশ করে।
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 — JSON সিরিয়ালাইজেশনের জন্য Kotlin লাইব্রেরি। @Serializable — অ্যানোটেশন। @SerialName — কাস্টম ফিল্ড নাম। সমর্থন: JSON, CBOR, ProtoBuf. Parcelize — Android Parcelable এর জন্য @Parcelize (ম্যানুয়াল বাস্তবায়ন ছাড়া). Gson vs Moshi vs kotlinx: kotlinx.serialization — Kotlin-first, কম্পাইল-সেফ, reflection ছাড়া। Moshi — অ্যানোটেশন + codegen. IT Sectr নতুন প্রকল্পের জন্য kotlinx.serialization এবং বিদ্যমান প্রকল্পের জন্য Moshi সুপারিশ করে।
@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
)
// ডিসিরিয়ালাইজেশন
val json = Json { ignoreUnknownKeys = true }
val response = json.decodeFromString<ApiResponse<List<User>>>(jsonString)
println("Users: ${response.data?.size ?: 0}")সচরাচর জিজ্ঞাসা
data class — ডেটার জন্য (equals/hashCode/copy এর স্বয়ংক্রিয় জেনারেশন). sealed class — টাইপ হায়ারার্কির জন্য (when এ চেক). sealed interface — একাধিক ইনহেরিটেন্স সহ একই।
let, run, with, apply, also. প্রসঙ্গ (it vs this) এবং রিটার্ন মান (result vs context) অনুযায়ী পৃথক। let — null safety, apply — কনফিগারেশন, also — সাইড ইফেক্ট।
CoroutineScope — coroutines এর পরিধি। lifecycleScope — Activity এর জন্য, viewModelScope — ViewModel এর জন্য। GlobalScope — সুপারিশ করা হয় না।
reified — inline ফাংশনে টাইপ সংরক্ষণ। T::class এবং is T অনুমতি দেয়। শুধুমাত্র inline ফাংশনের সাথে কাজ করে।
launch — ফলাফল ছাড়া। async — ফলাফল সহ (Deferred). runBlocking — main/test এর জন্য ব্লকিং ব্রিজ। withContext — Dispatcher পরিবর্তন।
সংক্ষিপ্তসার
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।