التغليف Encapsulation في Java | private و getters و setters بشرح تفصيلي للغاية

20:00 دقائق مجاني
شرح Encapsulation من الصفر: لماذا نخفي البيانات؟ وما معنى private؟ وكيف نستخدم getters و setters مع التحقق من القيم؟

في الدروس السابقة جعلنا خصائص الكلاس عامة مثل:

class Person {
  String name;
  int age;
}

هذا يعني أن أي جزء من البرنامج يستطيع أن يغيّر العمر والاسم مباشرة:

p1.age = -100; // قيمة غير منطقية

وهنا تظهر المشكلة: البرنامج يسمح بقيم خاطئة، وقد تتسبب في نتائج غير صحيحة. لذلك نحتاج طريقة لحماية البيانات وجعل تغييرها “منضبطًا”. هذه الفكرة تُسمّى التغليف (Encapsulation).

فكرة Encapsulation ببساطة

التغليف يعني:

  • نخفي البيانات داخل الكلاس باستخدام private.
  • نسمح بالوصول إليها أو تعديلها عبر طرق (Methods) منظّمة.
  • يمكننا داخل هذه الطرق أن نضع شروطًا تمنع القيم غير المنطقية.

مثال عملي كامل: Person بطريقة احترافية للمبتدئ

سنحوّل الخصائص إلى private، ثم نكتب:

  • Getter: لإرجاع القيمة (قراءة فقط).
  • Setter: لتغيير القيمة مع التحقق.
class Person {
  private String name;
  private int age;

  public String getName() {
    return name;
  }

  public void setName(String n) {
    name = n;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int a) {
    if (a >= 0) {
      age = a;
    }
  }
}

لاحظ الشرط داخل setAge: يمنع وضع عمر سالب. هذا مثال بسيط، لكنه يوضح الفكرة.

كيفية الاستخدام من خارج الكلاس

بعد التغليف لن تستطيع فعل هذا:

p.age = 10; // خطأ: لأن age أصبحت private

بل ستستخدم الطرق:

Person p = new Person();

p.setName("Ahmed");
p.setAge(25);

System.out.println(p.getName());
System.out.println(p.getAge());

بهذه الطريقة أصبح التحكم في البيانات داخل الكلاس نفسه، وهذا أكثر أمانًا وتنظيمًا.

لماذا هذا مهم جدًّا في البرمجة الحقيقية؟

  • لأنك تمنع إدخال بيانات غير صحيحة (مثل عمر سالب).
  • لأن تغيير القيم يصبح عبر نقطة واحدة (setter) مما يسهل الصيانة.
  • لأنك تستطيع لاحقًا إضافة قواعد تحقق معقدة دون تغيير طريقة استخدام الكلاس.

أخطاء شائعة للمبتدئين

  • نسيان كتابة Getter/Setter ثم الاستغراب لماذا لا يمكن الوصول للخاصية.
  • كتابة Setter دون أي تحقق، فتفقد جزءًا كبيرًا من فائدة التغليف.
  • الخلط بين أسماء الدوال: getAge للقراءة و setAge للتعديل.

✅ ممتاز. الآن دخلت فعلًا في أساسيات OOP بشكل صحيح. في الدروس القادمة سنكمل بناء مهارات أساسية أخرى (الثوابت، static، المصفوفات، النصوص، ثم مشروع صغير وخاتمة).