ما الذي تخفيه معدّلات الوصول في Java؟ الغوص في التغليف
\n\nكل من بدأ في تعلم Java واجه الكلمات الغامضة public و private و protected قبل الحقول والطرق. لكن ماذا تعني حقًا؟ لماذا لا يمكننا ببساطة جعل كل شيء public ونعيش بسلام؟ وما هو هذا package-private الغامض الذي لا يُذكر في معظم الدروس التعليمية؟
في هذه المقالة، سنشرح الفرق بين 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
Private: "ملكي وليس لأحد غيري"
\n\nمعدّل private هو الأكثر تقييدًا. الحقل أو الطريقة المميزة بـ private يمكن الوصول إليها فقط داخل نفس الصف. لا يمكن للورثة ولا للصفوف من نفس الحزمة الوصول إليها.
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\nPackage-private (افتراضي): "الجار الهادئ"
\n\nإذا لم تحدد أي معدّل، فإن Java تجعل الوصول تلقائيًا package-private. هذا يعني أن الحقل أو الطريقة مرئيان لجميع الصفوف داخل نفس الحزمة، لكنهما غير مرئيين خارجها.
\n\npackage 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متى تستخدم: للصفوف المساعدة