تخطَّ إلى المحتوى

🟣 شرح Kotlin

التحكّم بالظهور (Visibility Modifiers)

الدرس 26 من 27· ⏱ 2 دقائق قراءة· 🗓 آخر تحديث: ١٨ أكتوبر ٢٠٢٦

المُعدِّلات الأربعة

  • public (الافتراضي): مرئي من أي مكان.
  • private: محصور بنطاق التعريف (الملف أو الصنف).
  • protected: مرئي داخل الصنف وأصنافه الوارثة فقط.
  • internal: مرئي داخل نفس الوحدة (module) — مشروع/حزمة Gradle واحدة.

ما معنى "وحدة" عمليًّا؟ مجموعة الملفات التي تُترجَم معًا: مشروع Gradle واحد، أو مكتبة واحدة. إذا كتبت مكتبة ونشرتها، فكل ما هو internal يعمل في كودك الداخلي لكن لا يراه من يستخدم المكتبة. هذا أنسب لـ"تفاصيل التنفيذ" من public التي تصبح جزءًا من الواجهة التي يعتمد عليها الآخرون.

على مستوى الملف (top-level)

package app

public fun helper() { /* ... */ }   // public افتراضيًّا حتى بدون كتابتها
private fun onlyHere() { /* ... */ } // مرئية داخل هذا الملف فقط
internal val config = "prod"        // مرئية داخل نفس الوحدة فقط

// protected غير مسموحة على مستوى الملف — فقط داخل الأصناف

داخل الصنف

open class Account(private val id: String) {
    private val pin = "0000"        // يراها Account فقط
    protected open val limit = 1000 // يراها Account والأصناف الوارثة
    internal val bank = "بنكي"      // ترى داخل الوحدة كلها
    val owner = "براء"              // public افتراضيًّا
}

class SavingsAccount(id: String) : Account(id) {
    fun show() = println("الحد: $limit")   // مسموح: protected موروثة
}

الباني الخاص (private constructor)

مفيد لفرض إنشاء الكائن عبر دالة مصنع بدل new مباشر:

class Session private constructor(val token: String) {
    companion object {
        fun start(token: String) = Session(token)
    }
}

val s = Session.start("abc123")   // فقط عبر start()، لا Session("abc123") مباشرة

💡 القاعدة العملية: ابدأ بـ private وارفع الظهور فقط عند الحاجة الفعلية — يقلّل الاعتماديات غير المقصودة بين أجزاء الكود.

الفرق عن Java

KotlinJava
الافتراضيpublicمرئي داخل الحزمة (package-private)
protectedالصنف والأصناف الوارثة فقطوأيضًا كل الحزمة
private على مستوى الملفمرئي داخل الملفغير موجود
internalداخل الوحدةغير موجود

أخطاء شائعة

  • ترك كل شيء public (الافتراضي): أي جزء في المشروع يقدر يعتمد على تفاصيل كان يجب أن تبقى داخلية، فيصبح تعديلها لاحقًا مكلفًا.
  • توقّع أن protected تعني "داخل نفس الحزمة" كما في Java: في Kotlin تعني الصنف وأبناءه فقط.
  • protected على مستوى الملف: غير مسموح؛ تعمل فقط داخل الأصناف.

🎯 التالي: خلاصة المسار.

شرح التحكّم بالظهور (Visibility Modifiers) — Kotlin بالعربي
التحكّم بالظهور (Visibility Modifiers) — Kotlin بالعربي · The Code Fix

📚 لمزيد من التعمّق في Kotlin، راجِع التوثيق الرسمي لـ Kotlin.

هل كان هذا الدرس مفيدًا؟