الوحدة 3: حماية البيانات والتحكم بالوصول · الموضوع 7 من 17
الموضوع 7

التغليف Encapsulation

نُخفي البيانات داخل الكلاس، ونسمح بالتعامل معها فقط عبر دوال تفرض شروطنا.

class User - passwordمخفية + get()+ set() الوصول عبر دوال عامة بشروط
بعد هذا الدرس ستستطيع أن:
  • تعرّف التغليف Encapsulation، وتوضّح فائدته في حماية البيانات.
  • تحوّل خصائص الكلاس إلى private، وتكتب لها دوال get و set.
  • تضيف شروط تحقق داخل دوال set تمنع القيم غير الصالحة.
  • تولّد دوال get و set تلقائيًّا في NetBeans.

١ما هو التغليف؟

إخفاء بيانات الكائن ومنع قراءتها أو تعديلها مباشرة، مع إتاحة التعامل معها بشروط عبر دوال عامة. فكرته: إخفاء من جهة، وإتاحة مضبوطة من جهة أخرى.

خطوتان لتطبيقه

تغليفUser+ username : String+ password : StringUser - username : String- password : String+ getUsername() : String+ setUsername(u : String) : void+ getPassword() : String+ setPassword(p : String) : void
🧩 قبل: خصائص public يغيّرها أي أحد بأي قيمة. بعد: خصائص private (−) لا يصل إليها إلا الكلاس، ودوال public (+) تفرض الشروط.
+ public- private# protected~ defaultمسطّر: staticمائل: abstract

٢بدون تغليف: لا حماية

package user;public class User {    public String username;    public String password;}
package main;import user.User;public class Main {    public static void main(String[] args) {        User user1 = new User();        user1.username = "123";        user1.password = "123";    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
UserMain
User+ username : String+ password : StringMain+ main(args : String[]) : void

بهذه الطريقة لا قيود على username ولا password، فيمكن إسناد أي قيمة نصية لهما مباشرة.

٣مع التغليف: شروط عند الإدخال

package lab10;public class User {    private String username;    private String password;     public String getUsername() {        return username;    }     public void setUsername(String username) {        if (username.contains("=")) {            System.out.println("Error: username cannot "                    + "contain an equals sign (=)");        } else {            this.username = username;        }    }     public String getPassword() {        return password;    }     public void setPassword(String password) {        if (password.length() >= 6 && password.length() < 30) {            this.password = password;        } else {            System.out.println("Error: password must be "                    + "6-30 characters long");        }    }}
package lab10;public class Main {    public static void main(String[] args) {        User user1 = new User();        user1.setUsername("abc=856");        user1.setPassword("a123b");        System.out.println("username: " + user1.getUsername());        System.out.println("password: " + user1.getPassword());         User user2 = new User();        user2.setUsername("med88");        user2.setPassword("tu88tu");         System.out.println("username: " + user2.getUsername());        System.out.println("password: " + user2.getPassword());    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
UserMain
User- username : String- password : String+ getUsername() : String+ setUsername(username : String) : void+ getPassword() : String+ setPassword(password : String) : voidMain+ main(args : String[]) : void

ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.

Output – lab10 (run)×
run:
Error: username cannot contain an equals sign (=)
Error: password must be 6-30 characters long
username: null
password: null
username: med88
password: tu88tu
BUILD SUCCESSFUL (total time: 0 seconds)

user1 لم يحقق الشرطين، فرُفضت القيمتان وبقيتا null. أما user2 فقُبل.

التوليد التلقائي في NetBeans

بدل كتابة دوال get و set يدويًّا، يولّدها NetBeans لك:

  1. انقر بالزر الأيمن داخل الكلاس User، واختر Insert Code (أو اضغط Alt+Insert).
قائمة الزر الأيمن وفيها Insert Code
الزر الأيمن داخل الكلاس‏ ← ‏Insert Code
  1. من قائمة Generate اختر Getter and Setter.
قائمة Generate في NetBeans
قائمة Generate‏ ← ‏Getter and Setter
  1. حدّد الخصائص password و username، وفعّل خيار Encapsulate Fields ليحوّلها NetBeans إلى private تلقائيًّا، ثم اضغط Generate.
  2. أضف شروطك داخل دوال set، كما في التدريب 10.
نافذة توليد دوال get و set
نافذة Generate Getters and Setters: تحديد الخصائص وتفعيل Encapsulate Fields

٤فوائد التغليف

🛡️ حماية البياناتلا قيم غير صالحة: كلمة مرور قصيرة، عمر سالب…
🔧 سهولة التعديلتغيّر طريقة التخزين داخل الكلاس دون أن تتأثر الكلاسات الأخرى.
👁️ تحكّم في القراءةتستطيع إعادة القيمة بالشكل الذي تريده، أو منع قراءتها بحذف get.
التدريب العملي 10: تغليف كلاس المستخدمتطبيق الخطوات أعلاه على مشروع lab10.افتح التدريب ←

توقّع وتحقّق

أجب قبل أن تنظر إلى الشرح. التصحيح فوري، وإجاباتك تُحفظ.

في التغليف تكون الخصائص عادةً:

الدالة التي تعيد قيمة الخاصية name تُسمّى عادةً:

ما الناتج إذا رفضت setPassword القيمة ولم تُعطَ password قيمة قبلها؟

snippet
user.setPassword("12");   // أقل من 6System.out.println(user.getPassword());

أين نضع شرط «العمر لا يكون سالبًا»؟

الخلاصة

انتقل إلى تقييم الدرسأسئلة التقييم، وأكمل الفراغات.ابدأ التقييم ←
أنهيت وحدة «حماية البيانات والتحكم بالوصول»ثبّت ما تعلّمته بأسئلة مراجعة لمواضيع الوحدة.ابدأ المراجعة ←