object في Kotlin: الصيغة والاستخدام العملي للكائنات المفردة

المؤلف: IT Sectr نُشر: 2026-06-21 وقت القراءة: 9 دق

object في Kotlin هي طريقة تصريحية لإنشاء كائن مفرد (singleton) مع تهيئة كسولة وأمان للخيوط بشكل افتراضي. الكلمة المفتاحية object تحل محل فئة كاملة بمثيل واحد وتستخدم للإعلان عن الكائنات المفردة و companion object والكائنات المجهولة والأدوات الثابتة. وفقاً لتوثيق JetBrains Kotlin (2026)، فإن object declaration هي الطريقة الأبسط والأكثر أماناً لتنفيذ نمط singleton في عالم JVM.

النقاط الرئيسية

  • object - كلمة مفتاحية للإعلان عن فئة مفردة بمثيل واحد
  • تهيئة كسولة - يتم إنشاء object عند أول وصول، وليس عند تحميل الفئة
  • Companion object - مماثل للأعضاء الثابتة في Kotlin (لا توجد static keyword)
  • Object expression - كائن مجهول لتجاوز الأساليب بسرعة
  • أمان الخيوط - تهيئة object مضمونة لتكون thread-safe

ما هو object في Kotlin؟

object في Kotlin هو شكل إعلان خاص يعرف في نفس الوقت فئة وينشئ مثيلها الوحيد (singleton). إنه هجين من إعلان الفئة وإنشاء المثيل في بناء واحد.

في Java، يتطلب إنشاء singleton منشئاً خاصاً وحقلاً ثابتاً وطريقة getInstance ومعالجة أمان الخيوط. يقوم Kotlin object بذلك بسطر واحد من التعليمات البرمجية: object MySingleton { }. يقوم المترجم تلقائياً بتوليد تهيئة كسولة آمنة للخيوط باستخدام آلية static initializer في bytecode JVM.

وفقاً لمواصفات لغة 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 هو كائن خاص يُعلن داخل فئة بالكلمة المفتاحية 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. يؤدي ذلك إلى توليد طريقة ثابتة حقيقية في bytecode JVM، ويمكن الوصول إليها من كود Java بدون صيغة Companion.

Object expressions (الكائنات المجهولة)

Object expression هو كائن مجهول يُنشأ في المكان لتجاوز طرق فئة أو واجهة دون الإعلان عن فئة مسماة منفصلة.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("تم تنفيذ المهمة")
    }
}

thread(handler)

Object expressions تختلف عن تصريحات object بأنها تنشئ مثيلاً جديداً في كل مرة يتم تنفيذها. إنها ليست كائنات مفردة وليس لها اسم. يمكن للكائنات المجهولة التقاط المتغيرات من الإغلاق، تماماً مثل lambdas.

على عكس Java، حيث يمكن للفئات المجهولة وراثة نوع واحد فقط، يمكن لـ object expression في Kotlin وراثة أنواع متعددة في وقت واحد.

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 يمكن أن يعمل كحاوية للثوابت، لتحل محل الحقول static final في Java. Object يدعم الوراثة، مما يسمح بإنشاء تسلسلات هرمية للتكوين.

وفقاً للمكتبة المعيارية لـ Kotlin (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 آمنة في بيئة متعددة الخيوط؟

نعم، تهيئة object آمنة تماماً للخيوط بفضل المُهيئ الثابت لـ JVM. لا حاجة لأي مزامنة إضافية.

الخلاصة

  • object - كائن مفرد تصريحي مع تهيئة كسولة وآمنة للخيوط
  • companion object - أعضاء ثابتة في Kotlin، طرق مصنع، ثوابت
  • Object expression - كائنات مجهولة في المكان مع التقاط متغيرات من الإغلاق
  • الوراثة - object يمكنه وراثة فئات وواجهات، بما في ذلك أنواع متعددة
  • الأداء - تهيئة عبر static initializer لـ JVM، بدون overhead لـ double-checked locking
  • الاستخدام - خدمات مفردة، repository، ثوابت، مصانع، محولات المستمع
  • القيود - لا يوجد منشئ صريح، مثيل واحد لكل JVM

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا