مفهوم درجات الوصول في جافا
درجات الوصول ( encapsulation ) في Java, وتعني في الترجمة الحرفية التغليف, في الدرس السابق تعرّفنا على مفاهيم البرمجة الكائنية الموجهة.
و عرفنا ما هو Package و class و الفائدة منهم و تعرّفنا على الكائن و إنشاء كائن و الفائدة من الكائن. في هذا الدرس سوف نتعرف على الكبسلة أو ما يعرف بـ تحديد درجات الوصول encapsulation إلى البيانات الموجودة بداخل الكلاس.
و معنى درجة الوصول هي بعض الكلمات يمكننا إضافتهم عندما نضيف أشياء جديدة مثل الدوال و الكلاسات و المتغيرات من أجل تحديد طريقة الوصول إليها.
سوف نحتاج إلى إستخدام تحديد درجات الوصول encapsulation في حال كنا نعمل على برنامج كبير مع فريق برمجي. أي يعني فإذا كنت تعمل على برنامج معين مع فريق برمجي و تريد ضمان عدم الإساءة في كود معين كتبته أنت أو أحد المبرمجين. هنا نحدد له درجة وصول و صلاحيات مقيدة للوصول إلية.
و تطرقنا لكلمة بيانات في الدرس السابق و قلنا عندما نذكر كلمة بيانات في البرمجة الكائنية الموجهة oop فإننا نقصد بها المتغيرات و الدوال.
بإستطاعتنا عندما نقوم بتحديد درجات الوصول إلى هذه المتغيرات أو الدوال و نستطيع جعل المتغير أو الدالة محمية على مستوى الكلاس. يعني لا نستطيع الوصول إلى تلك الدالة أو المتغير إلا إذا كنا موجودين في نفس الكلاس أو نقوم بإنقاص درجة الحماية و نجعل هذا المتغير أو تلك الدالة محمية على مستوى الحزمة. أي أننا نستطيع الوصول لذلك المتغير أو الدالة من نفس الحزمة فقط أو من أي كلاس أو نقوم بإزالة. الحماية نهائياً بحيث نستطيع الوصول للمتغير أو الدالة من نفس الحزمة أو خارج الحزمة.
و توجد ثلاث أنواع من درجات الوصول encapsulation و هي:
- درجة حماية قصوى private.
- محمي protected و هي أنقص من السابقة.
- عام public يعني متاح للوصول.
الشكل العام لتعريف درجات الوصول في جافا
privaty int x=5; protected int y=23; public double z=28;
- الأول: لا نستطيع الوصول للمتغير إلا من خلال نفس الكلاس.
- الثاني: نستطيع الوصول للمتغير بشرط أن نكون بنفس الحزمة فقط.
- الثالث: متاح للوصول سواء من الحزمة أو خارجها.
الوصول لعنصر غير محمي public في جافا
يعني أن الكلاس أو الدالة أو المتغير الذي تم تعريفه public يمكن الوصول إليه مباشرتاً أي يمكن الوصول لخصائص هذا الكائن سواء في داخل الحزمة package أو خارجها من أي مكان في البرنامج.
package oop; class a { private int x=5; protected int y=23; public double z=26; } public class Oop { public static void main(String[] args) { a ob=new a(); System.out.println(ob.y); } }
لقد انشأنا Package بإسم oop ثم بعد ذلك قمنا بإنشاء كلاس إسمه a و كان يحتوي على متغيرات بداخله تحتوي درجات الوصول الثلاثة. و كل متغير له درجة وصول مختلفة و قيمة مختلفة و نوع بيانات مختلف ثم انشأنا كلاس آخر بإسم Oop. ودخلنا للبرنامج الرئيسي إشتقينا كائن ob من إسم الكلاس a ثم وضعنا new تعني إنشاء نسخة من الكلاس و تخزين كل المتغيرات بداخل المتغير ob. و عندما أتينا للطباعة عند كتابة الكائن ob و وضع نقطة سوف يقترح لنا المتغيرات y و z فقط لأن المتغير x محمي غير قادر على الوصول له.
الوصول لعنصر محمي private جافا
سنتعرف في هذه الفقرة على كيفية الوصول إلى متغير أو دالة محمية private. و الفائدة من الوصول للمتغير المحمي لأنه دائماً يتحتم علينا الوصول للمتغير المحمي لشيئين و هما تعديل في قيمة المتغير أو الحصول على قيمة مخزّنة داخل المتغير. مثلاً سوف ننشئ متغير محمي نوعه عددي ونريد الوصول له و للوصول للمتغير المحمي لا بد من إستخدام دالة وسيطة و نحن لدينا هدفين للوصول له.
package oop; class a { private int x; public void setx(int r) { x=r; } public int getx() { return x; } } public class Oop { public static void main(String[] args) { a ob=new a(); ob.setx(5); System.out.println(ob.getx()); } }
لقد انشأنا Package بإسم oop ثم بعد ذلك قمنا بإنشاء كلاس إسمه a و كان يحتوي على متغير عددي إسمه x و ليس لديه قيمة في الوقت الحالي. وبنينا دالة وسيطة عامة public void setx(int r) مهمتها أن تكون التعديل على قيمة x أو تخزين قيمة في المتغير x. وجعلناها void لا تعيد قيمة لأننا نريد أن نرسل إليها القيمة التي نريد تخزينها في x ثم انشأنا متغير وهو x=r لتخزين القيمة التي إستقبلناها. وأنشأنا المهمة الثانية public int getx ومهمتها تكون الحصول على قيمة x بإستخدام الدالة getx.
ثم دخلنا إلى البرنامج الرئيسي و انشأنا كائن ob من المتغير a ثم بدأنا بإرسال قيمة للمتغير x عبر. ob.setx واعطينا القيمة المرسلة هي 5 ثم كتبنا امر الطباعة بكتابة الكائن ووضع الدالة getx لطباعة القيمة.
من فوائد التغليف (الكبسلة) يمكن جعل الأشياء الموجودة في الكلاسات قابلة للقراءة أو قابلة للكتابة من قبل كلاسات خارجية.