Kotlin-এ object: সিনট্যাক্স এবং সিঙ্গলটন অবজেক্টের ব্যবহারিক প্রয়োগ

লেখক: IT Sectr প্রকাশিত: 2026-06-21 পড়ার সময়: 9 মিনিট

object Kotlin-এ একটি সিঙ্গলটন অবজেক্ট তৈরি করার ঘোষণামূলক উপায় যা ডিফল্টভাবে লেজি ইনিশিয়ালাইজেশন এবং থ্রেড সেফটি সহ আসে। object কীওয়ার্ড একটি সম্পূর্ণ ক্লাসকে একটি একক ইনস্ট্যান্স দিয়ে প্রতিস্থাপন করে এবং সিঙ্গলটন, companion object, anonymous object এবং স্ট্যাটিক ইউটিলিটি ঘোষণার জন্য ব্যবহৃত হয়। JetBrains Kotlin Documentation (2026) অনুসারে, object declaration JVM-জগতে সিঙ্গলটন বাস্তবায়নের সবচেয়ে সহজ এবং নিরাপদ উপায়।

মূল বিষয়

  • object - একটি একক ইনস্ট্যান্স সহ সিঙ্গলটন ক্লাস ঘোষণার কীওয়ার্ড
  • লেজি ইনিশিয়ালাইজেশন - object প্রথম অ্যাক্সেসে তৈরি হয়, ক্লাস লোডের সময় নয়
  • Companion object - Kotlin-এ স্ট্যাটিক সদস্যদের অনুরূপ (কোনো static কীওয়ার্ড নেই)
  • Object expression - মেথড ওভাররাইড করার জন্য তাৎক্ষণিক anonymous object
  • থ্রেড সুরক্ষা - object-এর ইনিশিয়ালাইজেশন নিশ্চিতভাবে thread-safe

Kotlin-এ object কী?

object Kotlin-এ একটি বিশেষ ঘোষণা ফর্ম যা একইসঙ্গে একটি ক্লাস সংজ্ঞায়িত করে এবং তার একক ইনস্ট্যান্স (সিঙ্গলটন) তৈরি করে। এটি একটি কন্সট্রাক্টে ক্লাস ঘোষণা এবং ইনস্ট্যান্স তৈরির সংমিশ্রণ।

Java-তে, সিঙ্গলটন তৈরি করতে একটি প্রাইভেট কন্সট্রাক্টর, একটি স্ট্যাটিক ফিল্ড, একটি getInstance মেথড এবং থ্রেড সুরক্ষা ব্যবস্থাপনার প্রয়োজন হয়। Kotlin object এটি কোডের এক লাইনে করে: object MySingleton { }। কম্পাইলার স্বয়ংক্রিয়ভাবে JVM বাইটকোডে static initializer প্রক্রিয়া ব্যবহার করে থ্রেড-সেফ লেজি ইনিশিয়ালাইজেশন জেনারেট করে।

Kotlin ভাষা স্পেসিফিকেশন (2026) অনুসারে, object declaration একটি ফাইনাল ক্লাসে কম্পাইল হয় যার একটি প্রাইভেট কন্সট্রাক্টর এবং একটি স্ট্যাটিক ব্লকে ইনিশিয়ালাইজড স্ট্যাটিক INSTANCE ফিল্ড থাকে। এটি JVM স্তরে ইনিশিয়ালাইজেশনের পারমাণবিকতা নিশ্চিত করে।

সিঙ্গলটন অবজেক্ট (object declaration)

Object declaration (সিঙ্গলটন অবজেক্ট) object কীওয়ার্ডের পরে একটি নাম ব্যবহার করে ঘোষণা করা হয়। অবজেক্টের বডিতে প্রপার্টি, মেথড, init ব্লক থাকতে পারে এবং এটি অন্যান্য ক্লাস বা ইন্টারফেস ইনহেরিট করতে পারে।

kotlin
object DatabaseManager {
    private val connection: String = "jdbc:postgresql://localhost:5432/app"
    
    fun query(sql: String): List<Map<String, Any>> {
        // কোয়েরি এক্সিকিউট করা
        return emptyList()
    }
}

// ব্যবহার
DatabaseManager.query("SELECT * FROM users")

DatabaseManager-এর ইনিশিয়ালাইজেশন প্রথম অ্যাক্সেসে ঘটে - লেজি এবং থ্রেড-সেফ। কোনো অতিরিক্ত সিঙ্ক্রোনাইজেশন কোডের প্রয়োজন নেই।

object-এর জন্য ইনহেরিটেন্স

Object সাধারণ ক্লাস এবং ইন্টারফেস ইনহেরিট করতে পারে। এটি একটি একক ইনস্ট্যান্স সহ একটি অ্যাবস্ট্রাক্ট ক্লাস বা ইন্টারফেসের বাস্তবায়ন হিসাবে object ব্যবহার করার অনুমতি দেয়।

kotlin
interface Logger {
    fun log(message: String)
}

object ConsoleLogger : Logger {
    override fun log(message: String) {
        println("[LOG] $message")
    }
}

Companion object

companion object হল একটি বিশেষ object যা একটি ক্লাসের ভিতরে companion কীওয়ার্ড দিয়ে ঘোষণা করা হয়। এটি Kotlin-এ স্ট্যাটিক সদস্যদের প্রতিস্থাপন করে কারণ ভাষায় static কীওয়ার্ড নেই।

kotlin
class ApiClient {
    companion object {
        private const val BASE_URL = "https://api.example.com"
        
        fun create(): ApiClient {
            return ApiClient()
        }
    }
}

// ApiClient ইনস্ট্যান্স না তৈরি করেই কল করা
val client = ApiClient.create()

Companion object-এর একটি নাম থাকতে পারে (ডিফল্ট Companion), ইন্টারফেস বাস্তবায়ন করতে পারে এবং extension functions-এর মাধ্যমে বিস্তৃত করা যেতে পারে। Java-তে স্ট্যাটিক মেথডের বিপরীতে, companion object হল একটি পূর্ণাঙ্গ অবজেক্ট যা আর্গুমেন্ট হিসাবে পাস বা ভেরিয়েবলে সংরক্ষণ করা যেতে পারে।

Kotlin সর্বোত্তম অনুশীলন (2026) অনুসারে, companion object ফ্যাক্টরি মেথড, কনস্ট্যান্ট এবং ক্লাস-সম্পর্কিত স্ট্যাটিক ইউটিলিটির জন্য ব্যবহৃত হয়। companion object-এর অতিরিক্ত ব্যবহার এড়ানোর পরামর্শ দেওয়া হয় - সম্পর্কহীন ইউটিলিটির জন্য টপ-লেভেল ফাংশন ভালো।

@JvmStatic অ্যানোটেশন

Java সামঞ্জস্যের জন্য, companion object মেথডগুলো @JvmStatic দিয়ে অ্যানোটেট করা যেতে পারে। এটি JVM বাইটকোডে একটি প্রকৃত স্ট্যাটিক মেথড জেনারেট করে, যা Companion সিনট্যাক্স ছাড়াই Java কোড থেকে অ্যাক্সেসযোগ্য।

Object expressions (anonymous object)

Object expression হল একটি anonymous object যা কোনো ক্লাস বা ইন্টারফেসের মেথড ওভাররাইড করার জন্য তাৎক্ষণিকভাবে তৈরি করা হয়, আলাদা নামযুক্ত ক্লাস ঘোষণা না করেই।

kotlin
val handler = object : Runnable {
    override fun run() {
        println("কার্য সম্পাদিত হয়েছে")
    }
}

thread(handler)

Object expressions object ঘোষণা থেকে ভিন্ন কারণ তারা প্রতিটি এক্সিকিউশনে একটি নতুন ইনস্ট্যান্স তৈরি করে। এগুলি সিঙ্গলটন নয় এবং এদের কোনো নাম নেই। anonymous object ল্যাম্বডার মতো তাদের ক্লোজার থেকে ভেরিয়েবল ক্যাপচার করতে পারে।

Java-র বিপরীতে, যেখানে anonymous class শুধুমাত্র একটি টাইপ ইনহেরিট করতে পারে, Kotlin-এর object expression একসাথে একাধিক টাইপ ইনহেরিট করতে পারে।

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("বাটন রেন্ডার হচ্ছে")
    override fun click() = println("বাটনে ক্লিক করা হয়েছে")
}

ব্যবহারিক প্রয়োগের দৃশ্যকল্প

Object Kotlin-এর সবচেয়ে বহুমুখী কন্সট্রাক্টগুলির মধ্যে একটি, অনেক দৃশ্যকল্পে ব্যবহৃত হয়।

Repository সিঙ্গলটন

Android প্রকল্পে, object প্রায়শই Repository ঘোষণার জন্য ব্যবহৃত হয় যেখানে একাধিক ইনস্ট্যান্সের প্রয়োজন নেই। একটি একক ইনস্ট্যান্স ডেটা সামঞ্জস্য নিশ্চিত করে।

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // ব্যবহারকারী পাওয়া হচ্ছে
        return null
    }
}

companion object-এর মাধ্যমে ফ্যাক্টরি মেথড

Companion object ফ্যাক্টরি মেথড সহ একাধিক কন্সট্রাক্টরের বিকল্প। নামযুক্ত ফ্যাক্টরি মেথড কোডকে স্ব-ডকুমেন্টিং করে তোলে।

kotlin
data class GsonParser {
    companion object {
        fun create(): GsonParser = GsonParser()
        fun createPretty(): GsonParser = GsonParser()
    }
}

কনস্ট্যান্ট এবং এনুমারেশন

Object কনস্ট্যান্টের জন্য একটি কন্টেইনার হিসাবে কাজ করতে পারে, Java-তে static final ফিল্ড প্রতিস্থাপন করে। Object ইনহেরিটেন্স সমর্থন করে, যা কনফিগারেশন হায়ারার্কি তৈরি করতে দেয়।

Kotlin স্ট্যান্ডার্ড লাইব্রেরি (2026) অনুসারে, object declaration Kotlin-এ সিঙ্গলটন তৈরি করার সবচেয়ে কার্যকরী উপায়, যা double-checked locking বাস্তবায়নকে ছাড়িয়ে যায় এবং Java-তে enum singleton-এর সাথে তুলনীয়।

সচরাচর জিজ্ঞাসিত প্রশ্ন

object একটি সাধারণ ক্লাস থেকে কীভাবে আলাদা?

Object একইসঙ্গে একটি ক্লাস ঘোষণা করে এবং তার একক ইনস্ট্যান্স তৈরি করে। একটি সাধারণ ক্লাসের কন্সট্রাক্টরের মাধ্যমে তৈরি একাধিক ইনস্ট্যান্স থাকতে পারে।

object declaration কখন ইনিশিয়ালাইজ হয়?

লেজি - অবজেক্টে প্রথম অ্যাক্সেসে। ততক্ষণ পর্যন্ত, কোনো মেমোরি বরাদ্দ হয় না এবং init ব্লকের কোড এক্সিকিউট হয় না।

object-এর কি কন্সট্রাক্টর থাকতে পারে?

না, object-এর স্পষ্ট কন্সট্রাক্টর থাকতে পারে না। ইনিশিয়ালাইজেশন init ব্লকে সম্পাদিত হয়, যা অবজেক্টে প্রথম অ্যাক্সেসে একবার কল হয়।

companion object সাধারণ object থেকে কীভাবে আলাদা?

companion object হল একটি object যা একটি ক্লাসের ভিতরে ঘোষণা করা হয়। এর সদস্যরা ইনস্ট্যান্স তৈরি না করেই ক্লাসের নামের মাধ্যমে অ্যাক্সেসযোগ্য, Java-র স্ট্যাটিক সদস্যদের প্রতিস্থাপন করে।

object declarations কি মাল্টিথ্রেডেড পরিবেশে নিরাপদ?

হ্যাঁ, object-এর ইনিশিয়ালাইজেশন JVM স্ট্যাটিক ইনিশিয়ালাইজারের কারণে সম্পূর্ণ thread-safe। কোনো অতিরিক্ত সিঙ্ক্রোনাইজেশনের প্রয়োজন নেই।

সারসংক্ষেপ

  • object - লেজি এবং থ্রেড-সেফ ইনিশিয়ালাইজেশন সহ ঘোষণামূলক সিঙ্গলটন
  • companion object - Kotlin-এ স্ট্যাটিক সদস্য, ফ্যাক্টরি মেথড, কনস্ট্যান্ট
  • Object expression - ক্লোজার থেকে ভেরিয়েবল ক্যাপচার সহ তাৎক্ষণিক anonymous object
  • ইনহেরিটেন্স - object একাধিক টাইপ সহ ক্লাস এবং ইন্টারফেস ইনহেরিট করতে পারে
  • পারফরম্যান্স - JVM static initializer-এর মাধ্যমে ইনিশিয়ালাইজেশন, double-checked locking-এর কোনো ওভারহেড নেই
  • ব্যবহার - সিঙ্গলটন সার্ভিস, repository, কনস্ট্যান্ট, ফ্যাক্টরি, listener অ্যাডাপ্টার
  • সীমাবদ্ধতা - কোনো স্পষ্ট কন্সট্রাক্টর নেই, প্রতি JVM-এ একটি ইনস্ট্যান্স

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন