companion object: أعضاء شبيهة بالساكنة في Kotlin
أضف companion objects إلى الأصناف لمحاكاة الدوال والثوابت الساكنة.
companion object: أعضاء شبيهة بالساكنة في Kotlin درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
لا توجد static، بل companion object
لا تحتوي Kotlin على كلمة محجوزة static. وبدلًا من ذلك، يوفر companion object المُصرَّح عنه داخل فئة أعضاء على مستوى الفئة (شبيهة بالأعضاء الساكنة).
التصريح عن companion object
ضع companion object داخل فئة. ويمكن استدعاء أعضائه باستخدام ClassName.member.
class MathUtils {
companion object {
fun square(x: Int) = x * x
}
}
fun main() {
println(MathUtils.square(5)) // 25
}الثوابت في companion object
توجد الثوابت عادةً في companion object، وغالبًا ما تُستخدم const val للقيم الحرفية المعروفة وقت الترجمة.
class HttpClient {
companion object {
const val DEFAULT_TIMEOUT = 5000
const val USER_AGENT = "MyApp/1.0"
}
}
fun main() {
println(HttpClient.DEFAULT_TIMEOUT)
println(HttpClient.USER_AGENT)
}companion object مُسمّى
يمكنك تسمية companion object. ويعمل كل من ClassName.member وClassName.CompanionName.member.
class Database {
companion object Factory {
fun create() = Database()
}
}
fun main() {
val db1 = Database.create() // works
val db2 = Database.Factory.create() // also works
println("$db1 / $db2")
}نمط Factory Method
استخدم الكائن المرافق لإنشاء مثيلات مع التحقق من الصحة أو باستخدام منطق إنشاء بديل.
class User private constructor(val name: String, val email: String) {
companion object {
fun create(name: String, email: String): User {
require(email.contains("@")) { "invalid email" }
return User(name, email)
}
}
}
fun main() {
val u = User.create("Ada", "ada@example.com")
println("${u.name} <${u.email}>")
}تنفيذ الواجهات
يمكن للكائن المرافق نفسه تنفيذ الواجهات، وهذا مفيد لدمجه مع الفئات التي تحتاج إلى عقد يشبه static.
interface Loadable<T> { fun load(): T }
class Config(val data: String) {
companion object : Loadable<Config> {
override fun load() = Config("loaded data")
}
}
fun main() {
println(Config.load().data)
}@JvmStatic للتكامل مع Java
أضف التعليق التوضيحي @JvmStatic إلى أعضاء الكائن المرافق لإتاحتهم لمستدعي Java بصفتهم أساليب static حقيقية.
class Util {
companion object {
@JvmStatic
fun greet(name: String) = "Hello, $name!"
}
}
fun main() {
println(Util.greet("Kotlin"))
// In Java: Util.greet("Java")
}الوصول إلى الكائن المرافق نفسه
يشير ClassName.Companion مباشرةً إلى الكائن المرافق. استخدمه عند تمريره كوسيط.
class Counter {
companion object {
fun greet() = "hi from companion"
}
}
fun main() {
val ref = Counter.Companion
println(ref.greet())
}الكائن المرافق مقابل المستوى الأعلى
بالنسبة إلى الدوال المساعدة التي لا تنتمي إلى فئة، يُفضَّل استخدام دوال المستوى الأعلى بدلًا من فئة لا تحتوي إلا على كائن مرافق.
// File-level — usually cleaner:
fun greet(name: String) = "Hi, $name!"
// Versus:
class Greeter { companion object { fun greet(n: String) = "Hi, $n!" } }
fun main() {
println(greet("Ada"))
println(Greeter.greet("Ada"))
}كائن مرافق واحد لكل فئة
يمكن للفئة أن تحتوي على كائن مرافق واحد كحد أقصى. ويمكن للكائنات الداخلية العادية الاحتفاظ بحالة مشتركة إضافية عند الحاجة.
class Service {
companion object {
val version = "1.0"
}
object InternalHelper { fun log() = println("internal") }
}
fun main() {
println(Service.version)
Service.InternalHelper.log()
}دوال الامتداد للكائن المرافق
يمكنك توسيع الكائن المرافق من خارج الفئة، وإضافة دوال مساعدة تحاكي static.
class Lib {
companion object
}
fun Lib.Companion.helper() = "added later"
fun main() {
println(Lib.helper())
}تحقق سريع
ما المقابل في Kotlin لأعضاء static في Java؟
مراجعة
لا تحتوي Kotlin على static. استخدم كائنًا مرافقًا للأعضاء على مستوى الفئة، مثل الثوابت والمصانع وتنفيذ الواجهات. أضف التعليق التوضيحي @JvmStatic للتكامل مع Java، أو وسّعه بدوال الامتداد لإضافة دوال مساعدة تحاكي static.
الأسئلة الشائعة
هل درس «companion object: أعضاء شبيهة بالساكنة في Kotlin» مجاني؟
نعم — نص درس «companion object: أعضاء شبيهة بالساكنة في Kotlin» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «companion object: أعضاء شبيهة بالساكنة في Kotlin»؟
أضف companion objects إلى الأصناف لمحاكاة الدوال والثوابت الساكنة. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «companion object: أعضاء شبيهة بالساكنة في Kotlin»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تصريح object: Singleton في Kotlin
- companion object: أعضاء شبيهة بالساكنة في Kotlin
- الكائنات المجهولة وتعبيرات الكائنات
- دوال Factory باستخدام companion object