object في Kotlin هي طريقة تصريحية لإنشاء كائن مفرد (singleton) مع تهيئة كسولة وأمان للخيوط بشكل افتراضي. الكلمة المفتاحية object تحل محل فئة كاملة بمثيل واحد وتستخدم للإعلان عن الكائنات المفردة و companion object والكائنات المجهولة والأدوات الثابتة. وفقاً لتوثيق JetBrains Kotlin (2026)، فإن object declaration هي الطريقة الأبسط والأكثر أماناً لتنفيذ نمط singleton في عالم JVM.
النقاط الرئيسية
object في Kotlin هو شكل إعلان خاص يعرف في نفس الوقت فئة وينشئ مثيلها الوحيد (singleton). إنه هجين من إعلان الفئة وإنشاء المثيل في بناء واحد.
في Java، يتطلب إنشاء singleton منشئاً خاصاً وحقلاً ثابتاً وطريقة getInstance ومعالجة أمان الخيوط. يقوم Kotlin object بذلك بسطر واحد من التعليمات البرمجية: object MySingleton { }. يقوم المترجم تلقائياً بتوليد تهيئة كسولة آمنة للخيوط باستخدام آلية static initializer في bytecode JVM.
وفقاً لمواصفات لغة Kotlin (2026)، يتم ترجمة object declaration إلى فئة نهائية مع منشئ خاص وحقل ثابت INSTANCE يتم تهيئته في كتلة ثابتة. وهذا يضمن ذرية التهيئة على مستوى JVM.
Object declaration (الكائن المفرد) يُعلن باستخدام الكلمة المفتاحية 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 هو كائن خاص يُعلن داخل فئة بالكلمة المفتاحية 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 (2026)، يُستخدم companion object لطرق المصنع والثوابت والأدوات الثابتة المرتبطة بالفئة. يُوصى بتجنب الاستخدام المفرط لـ companion object - للأدوات غير المرتبطة، يفضل استخدام دوال المستوى الأعلى.
للتوافق مع Java، يمكن تعليق طرق companion object بـ @JvmStatic. يؤدي ذلك إلى توليد طريقة ثابتة حقيقية في bytecode JVM، ويمكن الوصول إليها من كود Java بدون صيغة Companion.
Object expression هو كائن مجهول يُنشأ في المكان لتجاوز طرق فئة أو واجهة دون الإعلان عن فئة مسماة منفصلة.
val handler = object : Runnable {
override fun run() {
println("تم تنفيذ المهمة")
}
}
thread(handler)
Object expressions تختلف عن تصريحات object بأنها تنشئ مثيلاً جديداً في كل مرة يتم تنفيذها. إنها ليست كائنات مفردة وليس لها اسم. يمكن للكائنات المجهولة التقاط المتغيرات من الإغلاق، تماماً مثل lambdas.
على عكس Java، حيث يمكن للفئات المجهولة وراثة نوع واحد فقط، يمكن لـ 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 تنوعاً، ويُستخدم في سيناريوهات عديدة.
في مشاريع 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 (2026)، فإن object declaration هي الطريقة الأكثر أداءً لإنشاء singleton في Kotlin، متجاوزة تطبيقات double-checked locking ومماثلة لـ enum singleton في Java.
الأسئلة الشائعة
Object يعلن في نفس الوقت عن فئة وينشئ مثيلها الوحيد. الفئة العادية يمكن أن تحتوي على مثيلات متعددة يتم إنشاؤها عبر منشئ.
بشكل كسول - عند أول وصول للكائن. حتى ذلك الحين، لا يتم تخصيص ذاكرة ولا يتم تنفيذ كود كتلة init.
لا، object لا يمكن أن يكون له منشئ صريح. تتم التهيئة في كتلة init التي تُستدعى مرة واحدة عند أول وصول للكائن.
companion object هو object مُعلن داخل فئة. أعضاؤه متاحة عبر اسم الفئة دون إنشاء مثيل، لتحل محل الأعضاء الثابتة في Java.
نعم، تهيئة object آمنة تماماً للخيوط بفضل المُهيئ الثابت لـ JVM. لا حاجة لأي مزامنة إضافية.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا