مفهوم الـ Mutable and Immutable Objects

نتعرف في هذا المقال على المصطلحات الشائعة Mutable Objects and Immutable Objects

Mohammad Al-Aliمنذ 5 سنوات

السلام عليكم ورحمة الله وبركاته


في هذا المقال سنتعرف على بعض من المفاهيم الشائعة في البرمجة، وهي الـ Mutable Objects و الـ Immutable Objects. وسنقوم باستخدام لغة جافا لتوضيح المفاهيم بالأمثلة.


ما هي الـ Mutable Objects؟

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

 

class Student{

    private String name;
    private Date birthDate;
    
    public Student(String name, Date birthDate){
        this.name = name;
        this.birthDate = birthDate;
    }

    public void setName(String name){
        this.name = name;
    }
    
    public void setBirthDate(Date birthDate){
        this.birthDate = birthDate;    
    }

    public String getName(){
        return name;
    }

    public Date getBirthDate(){
        return birthDate;
    }
}


نلاحظ في الكود أن الكائن من نوع Student يمكن تعديله بعد إنشائه باستخدام دوال الـ setters.

Student mohammad = new Student("Mohammad", date);
mohammad.setName("MOHAMMAD");


ماذا عن الـ Immutable Objects؟


على عكس الـ Mutable Objects فإن الـ Immutable Objects لا يمكن التعديل على قيمها بعد إنشاءها. لنعدل على مثالنا السابق ونحذف منه الدوال التي تغير القيم:

 

class Student{

    private final String name;
    private final Date birthDate;
    
    public Student(String name, Date birthDate){
        this.name = name;
        this.birthDate = birthDate;
    }

    public String getName(){
        return name;
    }

    public Date getBirthDate(){
        return birthDate;
    }
}

 

الآن لا يمكننا التعديل على أي كائن بعد أن ننشئه، لأنه لا يوجد لدينا دوال تتيح لنا ذلك، كما أن الـ data members كلها ثابتة (final) لا يمكن تغييرها بعد اعطائها قيم في الـ Constructor.


ملاحظة حول الـ Strings في جافا:


أحد أهم الـ Immutable Objects الموجودة في جافا هي الـ Strings، حيث لا يمكنك التعديل على النص بعد إنشاءه، لذلك لا تجد دالة في String تعدل على النص في الكائن الذي تستدعيها منه. أي دالة تعدل على النص تعيد النسخة الجديدة بعد التعديل، مع الإبقاء على محتوى الكائن القديم كما هو. وإذا أردت إضافة بعض الحروف للنص بعمل concatenation فإن الناتج أيضا كائن نصي جديد يخزن في مكان جديد في الذاكرة.
لذلك بعض الـ IDEs تعطيك تنبيه إذا كنت تقوم بعمل concatenation لنصوص بداخل حلقة تكرارية (Loop) لأن ذلك سيؤدي إلى إنشاء نص جديد في كل iteration من الـ loop مما يؤدي إلى مشاكل في الأداء.

الصورة التالية من IntelliJ IDEA يقوم بتنبيهنا بأنه هناك String concatenation في loop.

 


ويقترح علينا استخدام الـ StringBuilder بدلاً عن ذلك.
 

 

كلمات دليلية: immutable mutable oop
6
إعجاب
6139
مشاهدات
0
مشاركة
4
متابع
متميز
محتوى رهيب

التعليقات (1)

مصعب العثمان:

بارك الله فيك شرح رائع

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !