عام، محمي، خاص وخاص بالحزمة في Java: تحليل كامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما الذي تخفيه معدّلات الوصول في Java؟ الغوص في التغليف

\n\n

كل من بدأ في تعلم Java واجه الكلمات الغامضة public و private و protected قبل الحقول والطرق. لكن ماذا تعني حقًا؟ لماذا لا يمكننا ببساطة جعل كل شيء public ونعيش بسلام؟ وما هو هذا package-private الغامض الذي لا يُذكر في معظم الدروس التعليمية؟

\n\n

في هذه المقالة، سنشرح الفرق بين public و protected و package-private و private في Java بأمثلة حقيقية مع الكود. ستتعلم كيف يعمل كل معدّل، وفي أي الحالات يجب استخدامها، ولماذا الاختيار الصحيح لمعدّل الوصول هو علامة على التفكير المعماري الجيد. هيا بنا!

\n\n

لماذا نحتاج إلى معدّلات الوصول أصلاً؟

\n\n

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

\n\n

الهدف الرئيسي هو التغليف. نخفي التفاصيل الداخلية لتنفيذ الصف ونقدم للخارج فقط ما هو ضروري حقًا. هذا يحمي البيانات من التغيير العرضي ويبسط صيانة الكود.

\n\n

نظرة عامة سريعة على مستويات الوصول الأربعة

\n\n

في Java، هناك أربعة مستويات للوصول (من الأكثر تقييدًا إلى الأكثر انفتاحًا):

\n\n
    \n
  • private — الوصول فقط داخل الصف
  • \n
  • package-private (افتراضي) — الوصول داخل الصف والحزمة
  • \n
  • protected — الصف + الحزمة + الورثة
  • \n
  • public — الوصول من أي مكان
  • \n
\n\n

Private: "ملكي وليس لأحد غيري"

\n\n

معدّل private هو الأكثر تقييدًا. الحقل أو الطريقة المميزة بـ private يمكن الوصول إليها فقط داخل نفس الصف. لا يمكن للورثة ولا للصفوف من نفس الحزمة الوصول إليها.

\n\n
public class BankAccount {\n    private double balance;  // يمكن الوصول إليه فقط داخل الصف\n\n    public BankAccount(double initialBalance) {\n        this.balance = initialBalance;\n    }\n\n    public void deposit(double amount) {\n        if (amount > 0) {\n            balance += amount;\n        }\n    }\n\n    // هذه الطريقة ترى الحقل الخاص لأنها داخل الصف\n    public double getBalance() {\n        return balance;\n    }\n}\n\npublic class Main {\n    public static void main(String[] args) {\n        BankAccount account = new BankAccount(1000);\n        // account.balance = 5000;  // خطأ في الترجمة! balance خاص\n        System.out.println(account.getBalance());  // يعمل من خلال الطريقة العامة\n    }\n}
\n\n

متى تستخدم: للبيانات الداخلية للصف التي لا ينبغي تغييرها من الخارج (مثل العداد، الحالة الداخلية للكائن).

\n\n

Package-private (افتراضي): "الجار الهادئ"

\n\n

إذا لم تحدد أي معدّل، فإن Java تجعل الوصول تلقائيًا package-private. هذا يعني أن الحقل أو الطريقة مرئيان لجميع الصفوف داخل نفس الحزمة، لكنهما غير مرئيين خارجها.

\n\n
package com.pythonlib.utils;\n\nclass Helper {  // صف package-private (بدون معدّل)\n    String secretMessage = "مرئي فقط داخل الحزمة";  // حقل package-private\n\n    void displayMessage() {  // طريقة package-private\n        System.out.println(secretMessage);\n    }\n}\n\npackage com.pythonlib.app;\n\nimport com.pythonlib.utils.Helper;\n\npublic class App {\n    public static void main(String[] args) {\n        Helper helper = new Helper();\n        // helper.secretMessage = "خطأ!";  // غير مرئي — حزمة مختلفة\n        // helper.displayMessage();  // خطأ في الترجمة\n    }\n}
\n\n

متى تستخدم: للصفوف المساعدة

المدونات

توصيات الكتب