object در Kotlin: چیست، نحو و کاربرد اشیاء singleton

نویسنده: IT Sectr منتشر شده: 2026-06-21 زمان مطالعه: 9 دقیقه

object در Kotlin — یک روش اعلانی برای ایجاد شیء singleton با مقداردهی اولیه تنبل (lazy) و ایمنی در برابر نخ (thread-safe) به صورت پیش‌فرض است. کلمه کلیدی object یک کلاس کامل با یک نمونه واحد را جایگزین می‌کند و برای اعلان singleton، companion object، اشیاء ناشناس و ابزارهای ایستا استفاده می‌شود. بر اساس JetBrains Kotlin Documentation (2026)، object declaration ساده‌ترین و امن‌ترین روش پیاده‌سازی singleton در دنیای JVM است.

نکات کلیدی

  • object — کلمه کلیدی برای اعلان کلاس singleton با یک نمونه واحد
  • تنبل (lazy) — object در اولین دسترسی ایجاد می‌شود، نه هنگام بارگذاری کلاس
  • Companion object — معادل اعضای ایستا در Kotlin (کلمه کلیدی static وجود ندارد)
  • Object expression — شیء ناشناس برای بازتعریف متدها در لحظه
  • ایمنی در برابر نخ — مقداردهی اولیه object به طور تضمینی thread-safe است

object در Kotlin چیست؟

object در Kotlin — یک شکل خاص از اعلان است که همزمان یک کلاس را تعریف کرده و تنها نمونه آن (singleton) را ایجاد می‌کند. این یک ترکیب class declaration و instance creation در یک ساختار است.

در Java برای ایجاد singleton باید یک سازنده خصوصی، فیلد ایستا، متد getInstance بنویسید و ایمنی در برابر نخ را مدیریت کنید. Kotlin object این کار را با یک خط کد انجام می‌دهد: object MySingleton { }. کامپایلر به طور خودکار مقداردهی اولیه تنبل و ایمن در برابر نخ را با استفاده از مکانیزم static initializer در بایت‌کد JVM تولید می‌کند.

بر اساس Kotlin Language Specification (2026)، object declaration به یک کلاس final با سازنده خصوصی و فیلد ایستا INSTANCE که در یک بلوک ایستا مقداردهی می‌شود، کامپایل می‌گردد. این اتمیک بودن مقداردهی اولیه را در سطح JVM تضمین می‌کند.

اشیاء singleton (object declaration)

Object declaration (شیء singleton) با استفاده از کلمه کلیدی 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 Best Practices (2026)، companion object برای متدهای کارخانه‌ای، ثابت‌ها و ابزارهای ایستای مرتبط با کلاس استفاده می‌شود. توصیه می‌شود از استفاده بیش از حد companion object خودداری شود — برای ابزارهای نامرتبط بهتر است از توابع سطح بالا استفاده کنید.

توصیف‌کننده @JvmStatic

برای سازگاری با Java می‌توان متدهای companion object را با @JvmStatic توصیف کرد. این کار یک متد ایستای واقعی در بایت‌کد JVM تولید می‌کند که از کد Java بدون سینتکس Companion قابل دسترسی است.

Object expressions (اشیاء ناشناس)

Object expression — یک شیء ناشناس است که در محل برای بازتعریف متدهای یک کلاس یا رابط بدون اعلان یک کلاس نام‌گذاری شده جداگانه ایجاد می‌شود.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("وظیفه اجرا شد")
    }
}

thread(handler)

Object expressions با اعلان‌های object تفاوت دارند زیرا در هر بار اجرا یک نمونه جدید ایجاد می‌کنند. آنها singleton نیستند و نام ندارند. اشیاء ناشناس می‌توانند متغیرها را از بسته‌شدن (closure) دریافت کنند، مشابه لامبداها.

بر خلاف Java که در آن کلاس‌های ناشناس فقط می‌توانند از یک نوع ارث‌بری کنند، 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 است که در سناریوهای متعددی به کار می‌رود.

Singleton 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 می‌تواند به عنوان ظرفی برای ثابت‌ها عمل کند و فیلدهای static final را در Java جایگزین کند. همچنین object از ارث‌بری پشتیبانی می‌کند که امکان ایجاد سلسله‌مراتب پیکربندی را فراهم می‌کند.

بر اساس Kotlin Standard Library (2026)، object declaration کارآمدترین روش ایجاد singleton در Kotlin است، از نظر سرعت از پیاده‌سازی‌های "double-checked locking" پیشی گرفته و با enum singleton در Java قابل مقایسه است.

سوالات متداول

object چه تفاوتی با کلاس معمولی دارد؟

Object همزمان یک کلاس را اعلان کرده و تنها نمونه آن را ایجاد می‌کند. یک کلاس معمولی می‌تواند نمونه‌های متعددی داشته باشد که از طریق سازنده ایجاد می‌شوند.

object declaration چه زمانی مقداردهی می‌شود؟

به صورت تنبل — در اولین دسترسی به شیء. قبل از آن حافظه تخصیص داده نمی‌شود و کد در بلوک init اجرا نمی‌گردد.

آیا object می‌تواند سازنده داشته باشد؟

خیر، object نمی‌تواند سازنده صریح داشته باشد. مقداردهی اولیه در بلوک init انجام می‌شود که یک بار در اولین دسترسی به شیء فراخوانی می‌گردد.

companion object چه تفاوتی با object معمولی دارد؟

companion object — یک object است که در داخل یک کلاس اعلان شده است. اعضای آن از طریق نام کلاس بدون ایجاد نمونه قابل دسترسی هستند که جایگزین اعضای ایستا Java می‌شود.

آیا object declarations در محیط چندنخی ایمن هستند؟

بله، مقداردهی object به دلیل مقداردهنده اولیه ایستا JVM کاملاً thread-safe است. هیچ همگام‌سازی اضافی مورد نیاز نیست.

خلاصه

  • object — singleton اعلامی با مقداردهی تنبل و ایمن در برابر نخ
  • companion object — اعضای ایستا در Kotlin، متدهای کارخانه‌ای، ثابت‌ها
  • Object expression — اشیاء ناشناس در محل با دریافت متغیرها از بسته‌شدن
  • ارث‌بری — object می‌تواند از کلاس‌ها و رابط‌ها از جمله چندین نوع ارث‌بری کند
  • عملکرد — مقداردهی از طریق static initializer JVM، بدون سربار double-checked locking
  • کاربرد — سرویس‌های singleton، repository، ثابت‌ها، کارخانه‌ها، آداپتورهای listener
  • محدودیت‌ها — عدم وجود سازنده صریح، یک نمونه برای کل JVM

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید