object در Kotlin — یک روش اعلانی برای ایجاد شیء singleton با مقداردهی اولیه تنبل (lazy) و ایمنی در برابر نخ (thread-safe) به صورت پیشفرض است. کلمه کلیدی object یک کلاس کامل با یک نمونه واحد را جایگزین میکند و برای اعلان singleton، companion object، اشیاء ناشناس و ابزارهای ایستا استفاده میشود. بر اساس JetBrains Kotlin Documentation (2026)، object declaration سادهترین و امنترین روش پیادهسازی singleton در دنیای JVM است.
نکات کلیدی
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 تضمین میکند.
Object declaration (شیء singleton) با استفاده از کلمه کلیدی object به همراه یک نام اعلان میشود. بدنه شیء میتواند شامل ویژگیها، متدها، بلوکهای init باشد و از کلاسها یا رابطهای دیگر ارثبری کند.
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 را به عنوان پیادهسازی یک کلاس انتزاعی یا رابط با یک نمونه واحد فراهم میکند.
interface Logger {
fun log(message: String)
}
object ConsoleLogger : Logger {
override fun log(message: String) {
println("[LOG] $message")
}
}
companion object — یک object ویژه است که در داخل یک کلاس با کلمه کلیدی companion اعلان میشود. این عضوهای ایستا را در Kotlin جایگزین میکند، زیرا در این زبان کلمه کلیدی static وجود ندارد.
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 خودداری شود — برای ابزارهای نامرتبط بهتر است از توابع سطح بالا استفاده کنید.
برای سازگاری با Java میتوان متدهای companion object را با @JvmStatic توصیف کرد. این کار یک متد ایستای واقعی در بایتکد JVM تولید میکند که از کد Java بدون سینتکس Companion قابل دسترسی است.
Object expression — یک شیء ناشناس است که در محل برای بازتعریف متدهای یک کلاس یا رابط بدون اعلان یک کلاس نامگذاری شده جداگانه ایجاد میشود.
val handler = object : Runnable {
override fun run() {
println("وظیفه اجرا شد")
}
}
thread(handler)
Object expressions با اعلانهای object تفاوت دارند زیرا در هر بار اجرا یک نمونه جدید ایجاد میکنند. آنها singleton نیستند و نام ندارند. اشیاء ناشناس میتوانند متغیرها را از بستهشدن (closure) دریافت کنند، مشابه لامبداها.
بر خلاف Java که در آن کلاسهای ناشناس فقط میتوانند از یک نوع ارثبری کنند، Kotlin object expression میتواند از چندین نوع همزمان ارثبری کند.
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 است که در سناریوهای متعددی به کار میرود.
در پروژههای Android از object اغلب برای اعلان Repository استفاده میشود، جایی که به نمونههای متعدد نیاز نیست. یک نمونه واحد سازگاری دادهها را تضمین میکند.
object UserRepository {
fun getUser(id: Int): User? {
// دریافت کاربر
return null
}
}
Companion object با متدهای کارخانهای — جایگزینی برای سازندههای متعدد. متدهای کارخانهای نامگذاری شده کد را خودمستندساز میکنند.
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 همزمان یک کلاس را اعلان کرده و تنها نمونه آن را ایجاد میکند. یک کلاس معمولی میتواند نمونههای متعددی داشته باشد که از طریق سازنده ایجاد میشوند.
به صورت تنبل — در اولین دسترسی به شیء. قبل از آن حافظه تخصیص داده نمیشود و کد در بلوک init اجرا نمیگردد.
خیر، object نمیتواند سازنده صریح داشته باشد. مقداردهی اولیه در بلوک init انجام میشود که یک بار در اولین دسترسی به شیء فراخوانی میگردد.
companion object — یک object است که در داخل یک کلاس اعلان شده است. اعضای آن از طریق نام کلاس بدون ایجاد نمونه قابل دسترسی هستند که جایگزین اعضای ایستا Java میشود.
بله، مقداردهی object به دلیل مقداردهنده اولیه ایستا JVM کاملاً thread-safe است. هیچ همگامسازی اضافی مورد نیاز نیست.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید