Typealias হল একটি বিদ্যমান টাইপের জন্য বিকল্প নাম তৈরি করার Kotlin প্রক্রিয়া। typealias কীওয়ার্ড আপনাকে একটি নতুন টাইপ তৈরি না করেই জটিল টাইপ ঘোষণাকে একটি ছোট এবং স্পষ্ট উপনাম দিয়ে প্রতিস্থাপন করতে দেয়। Kotlin ডকুমেন্টেশন (2026) অনুসারে, typealias কোড পঠনযোগ্যতা উন্নত করে, বিশেষ করে ফাংশনাল টাইপযুক্ত ফাংশন সিগনেচারে। Typealias দীর্ঘ ঘোষণাগুলিকে স্পষ্ট নামযুক্ত টাইপ দিয়ে প্রতিস্থাপন করে কোডকে স্ব-ডকুমেন্টিং করে তোলে।
মূল বিষয়
Typealias (টাইপ উপনাম) এমন একটি ঘোষণা যা একটি বিদ্যমান টাইপের জন্য একটি বিকল্প নাম প্রবর্তন করে। সিনট্যাক্স: typealias নতুননাম = বিদ্যমানটাইপ। ঘোষণার পরে, নতুননাম যেখানে বিদ্যমানটাইপ প্রত্যাশিত সেখানে ব্যবহার করা যেতে পারে — কম্পাইলার তাদের একই টাইপ হিসাবে বিবেচনা করে। বাইটকোড স্তরে, typealias কোনো চিহ্ন রাখে না: সমস্ত উপনাম তথ্য কম্পাইল টাইমে মুছে ফেলা হয়।
Typealias-এর মূল উদ্দেশ্য হল কোড পঠনযোগ্যতা উন্নত করা। একটি দীর্ঘ সিগনেচার fun process(callback: (Result) -> Unit)-এর পরিবর্তে, আপনি typealias Callback = (Result) -> Unit লিখতে পারেন এবং Callback-কে প্যারামিটার টাইপ হিসাবে ব্যবহার করতে পারেন। এটি বিশেষভাবে উপযোগী যখন একই ফাংশনাল টাইপ কোডের একাধিক জায়গায় পুনরাবৃত্তি হয়: উপনামটি সংজ্ঞার একটি একক বিন্দু হিসেবে কাজ করে এবং টাইপের উদ্দেশ্য ডকুমেন্ট করে।
Typealias একটি নতুন টাইপ তৈরি করে না — এটি শুধু একটি প্রতিশব্দ। Callback এবং (Result) -> Unit টাইপের ভেরিয়েবল সম্পূর্ণ বিনিময়যোগ্য। কম্পাইলার কোনো ত্রুটি দেবে না যদি Callback প্রত্যাশিত একটি ফাংশনে সরাসরি ল্যাম্বডা পাস করা হয়। এটি typealias-কে inline class (value class) থেকে আলাদা করে, যা কম্পাইল-টাইম চেকিং সহ একটি নতুন র্যাপার টাইপ তৈরি করে। Typealias হল পুনঃনামকরণ, মোড়কীকরণ নয়।
Kotlin-এ typealias-এর সবচেয়ে সাধারণ ব্যবহার হল ফাংশনাল টাইপের জন্য। (Int, String) -> Boolean বা (List
// Without typealias
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// With typealias
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// Usage in class
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
উদাহরণে, typealias UserFilter জটিল ফাংশনাল টাইপ (List
Typealias জেনেরিক প্যারামিটার সমর্থন করে, যা এটিকে আরও নমনীয় করে তোলে। আপনি typealias Mapper
// Generic typealias
typealias Mapper<T, R> = (T) -> R
typealias Provider<T> = () -> T
typealias ListTransformer<T> = (List<T>) -> List<T>
fun processNumbers(mapper: Mapper<Int, String>) {
// mapper type is (Int) -> String
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
তালিকায়, Mapper
নেস্টেড ক্লাস এবং দীর্ঘ প্যারামিটারাইজড টাইপ আরেকটি ক্ষেত্র যেখানে typealias কোডকে গুরুত্বপূর্ণভাবে সরল করে। যদি একটি ক্লাস নেস্টিং অনুক্রমে (Outer.Inner.Nested) গভীরে থাকে, তবে পুরো নাম দিয়ে উল্লেখ করা কোডকে জটিল করে তোলে। Typealias এই ধরনের অ্যাক্সেস সংক্ষিপ্ত করে এবং আরও পঠনযোগ্য করে তোলে। এটি বিশেষ করে দীর্ঘ নামের থার্ড-পার্টি লাইব্রেরির ক্লাসের জন্য প্রাসঙ্গিক।
// Alias for nested class
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// Alias for long library type
typealias UserId = Long
typealias JsonMap = Map<String, Any?>
fun process(error: NetworkError) {
println("${error.code}: ${error.message}")
}
fun parseJson(data: JsonMap): UserId {
return data["id"] as? Long ?: 0L
}
উদাহরণে, NetworkError নেস্টেড ক্লাস NetworkResponse.Error-এর জন্য একটি উপনাম। typealias ইম্পোর্ট করে, আপনি NetworkError-কে নেস্টিং অনুক্রম প্রকাশ না করেই একটি সাধারণ টাইপ হিসাবে ব্যবহার করতে পারেন। JsonMap ডকুমেন্ট করে যে ম্যাপটি একটি JSON অবজেক্ট উপস্থাপন করে। UserId একটি নির্দিষ্ট প্রসঙ্গে Long-এর উদ্দেশ্য স্পষ্ট করে — পাঠক অবিলম্বে বুঝতে পারে যে এটি একটি ব্যবহারকারী শনাক্তকারী, একটি এলোমেলো সংখ্যা নয়। তবে, typealias যেখানে UserId প্রত্যাশিত সেখানে একটি সাধারণ Long পাস করতে বাধা দেয় না — এর জন্য একটি value class প্রয়োজন।
Typealias এবং inline class (value class) বিভিন্ন সমস্যা সমাধান করে, যদিও উভয়ই একটি টাইপের জন্য একটি নতুন নাম প্রবর্তন করে। Typealias শুধু একটি প্রতিশব্দ: UserId = Long টাইপের একটি ভেরিয়েবল কোনো চেক ছাড়াই যেকোনো Long গ্রহণ করে। Inline class একটি মানকে একটি নতুন টাইপে মোড়ানো করে যা কম্পাইল টাইমে চেক করা হয়: যেখানে inline class UserId প্রত্যাশিত সেখানে স্পষ্ট রূপান্তর ছাড়া একটি সাধারণ Long পাস করা অসম্ভব।
| বৈশিষ্ট্য | Typealias | Inline class |
|---|---|---|
| নতুন টাইপ | না — মূলের প্রতিশব্দ | হ্যাঁ — চেক সহ নতুন টাইপ |
| কর্মক্ষমতা | শূন্য — সম্পূর্ণ মুছে যায় | শূন্য — বাইটকোডে মোড়ক সরানো হয় |
| উত্তরাধিকার | না | না (চূড়ান্ত ক্লাস) |
| নিজস্ব পদ্ধতি | না | হ্যাঁ — ফাংশন ঘোষণা করা যেতে পারে |
| টাইপ নিরাপত্তা | না — মূলের সাথে বিনিময়যোগ্য | হ্যাঁ — কম্পাইলার টাইপ পৃথক করে |
সারণী দুটি প্রক্রিয়ার মধ্যে পার্থক্য দেখায়। Typealias সংক্ষিপ্ত নাম এবং কোড ডকুমেন্টেশনের জন্য উপযুক্ত যখন কঠোর টাইপিং প্রয়োজন হয় না। value class কীওয়ার্ড (পূর্বে inline class) এর মাধ্যমে Inline class প্রয়োজন যখন একই আদিম টাইপের শব্দার্থগতভাবে ভিন্ন মানের মধ্যে পার্থক্য করা গুরুত্বপূর্ণ। উদাহরণস্বরূপ, UserId এবং OrderId উভয়ই Long, কিন্তু যেখানে অন্যটি প্রত্যাশিত সেখানে একটি পাস করা একটি যৌক্তিক ত্রুটি যা value class কম্পাইল টাইমে প্রতিরোধ করে।
সচরাচর জিজ্ঞাস্য
Import alias (import com.example.LongName as Short) ইম্পোর্ট স্তরে কাজ করে — এটি শুধুমাত্র বর্তমান ফাইলে নাম সংক্ষিপ্ত করে। Typealias একটি বৈশ্বিক উপনাম ঘোষণা করে যা ইম্পোর্টের পরে পুরো প্রকল্পে উপলব্ধ।
হ্যাঁ, typealias ফাংশনাল টাইপের জন্য পুনরাবৃত্ত সংজ্ঞা সমর্থন করে, তবে সতর্কতার সাথে: typealias Rec
না, typealias কম্পাইল টাইমে সম্পূর্ণ মুছে যায়। বাইটকোড এবং রানটাইম স্তরে কোনো মোড়ক ছাড়াই মূল টাইপ ব্যবহার করা হয়। কর্মক্ষমতা সরাসরি মূল টাইপ ব্যবহারের সমান।
Typealias অন্য typealias-কে উল্লেখ করতে পারে — একে উপনামের শৃঙ্খল বলে। শৃঙ্খলের গভীরতা আনুষ্ঠানিকভাবে সীমাহীন, কিন্তু পঠনযোগ্যতার জন্য 2–3 স্তরের বেশি সুপারিশ করা হয় না। কম্পাইলার বিশ্লেষণ পর্যায়ে শৃঙ্খল সম্পূর্ণরূপে সমাধান করে।
না, typealias একটি শীর্ষ-স্তরের ঘোষণা বা ক্লাস/অবজেক্টের সদস্য। ফাংশনের ভিতরে typealias ঘোষণা করা যায় না। স্থানীয় টাইপ সংক্ষিপ্তকরণের জন্য, ফাইলের মধ্যে import alias ব্যবহার করুন বা typealias মডিউল স্তরে রাখুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন