المُعدِّلات الأربعة
- 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
| Kotlin | Java | |
|---|---|---|
| الافتراضي | public | مرئي داخل الحزمة (package-private) |
protected | الصنف والأصناف الوارثة فقط | وأيضًا كل الحزمة |
private على مستوى الملف | مرئي داخل الملف | غير موجود |
internal | داخل الوحدة | غير موجود |
أخطاء شائعة
- ترك كل شيء
public(الافتراضي): أي جزء في المشروع يقدر يعتمد على تفاصيل كان يجب أن تبقى داخلية، فيصبح تعديلها لاحقًا مكلفًا. - توقّع أن
protectedتعني "داخل نفس الحزمة" كما في Java: في Kotlin تعني الصنف وأبناءه فقط. protectedعلى مستوى الملف: غير مسموح؛ تعمل فقط داخل الأصناف.
🎯 التالي: خلاصة المسار.