الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تأجيل إعطاء القيم الابتدائية للكائنات

مغلق
بدأه علاء الصالحي في 8 أغسطس 2007 · 2 رد · 631 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تأجيل إعطاء القيم الابتدائية للكائنات Lazy initialization

أحببت أن أنقل لكم هذا الموضوع من مدونتي

أتمنى أن يحوز على رضاكم

وكالعادة أراءكم العلمية عن الموضوع في المنتدى

رأيكم في طريقة الكتابة على المدونة

رابط الموضوع على مدونتي

تأجيل إعطاء القيم الابتدائية للكائنات (تأجيل التهيئة) Lazy initialization

هناك سببان ريئيسيان لتأجيل تهيئة initialization لكائن Object ما وهما كالتالي

1- أن يكون الكائن ذو ثقل في الذاكرة

2- أن يكون الكائن مكلف في عملية الإنشاء مع أنه اختياري الاستخدام بمعنى أنه يستخدم في بعض الأحيان وليس في جميعها

بالنسبة للسبب الأول نجد أن عملية تأجيل التهيئة مفيدة في الغالب

أما بالنسبة للسبب التالي فليس بالضرورة أن يكون تأجيل التهيئة للكائن ذو فائدة قد يكون في بعض الأحيان ذو ضرر

مثال:

في برامج الواقعية real-program نحن نحتاج للوقت بشكل كبير خصوصا في حالة تعدد الخيوط multithread

لذا نعمد في بعض الأحيان إلى إنشاء الكائنات بشكل متلهف عندما يكون المعالج خالي

وفي أحيان أخرى نعمل على تأجيل التهيئة إذا كان المعالج مشغول في برامج ذات أهمية priorty أعلى

لذا نعمد إلى تأجيل تهيئة الكائنات للبرامج الأقل أهمية

بعد أن تعرفنا على ماهية تأجيل التهيئة يأتي السؤال المهم كيف أقوم بتأجيل تهيئة كائن ما

المثال التالي مع الشرح التابع له يسوضح العملية بإذن الله

public final class MyFrame extends Frame{

private MessageBox mb_; //null, implicit

private void showMessage(String message)

{

if(mb_==null)//تنفذ عند أول نداء لهذه الطريقة بعد ذلك تهمش بشكل دائم

mb_=new MessageBox();

//set the message text

mb_.setMessage( message );

mb_.pack();

mb_.show();

}

}

المثال يتحدث عن نافذة Frame تقوم بإطلاع المستخدم لها على بعض الأخطاء من خلال الكائن mb_

نلاحظ التالي ليس بالضرورة أن تحصل أخطاء عندي في النافذة

بالتالي ليس بالضرورة أني سأحتاج الكائن mb_

فلماذا يجب عليه أن أبنيه مبكراً لما لا أتأخر قليلاً حتى يحصل الخطأ الأول

بالتالي عندما يحصل الخطأ الأول فعليه أن أن أفحص إذا كان الكائن يحتوي قيمة أم أنه فارغ null

إن كان فارغ فأنا بحاجة إلى بنائه وإلا فأنا سأكمل بدون مشاكل

محظورات عليك التنبه لها

1- لا تقوم بإعطاء القيمة null للكائن مرة أخرى لأنك تتحمل التعقيد لإنشاء الكائن مرة أخرى

(قد تحتاج إلى ذلك في بعض الحالات كأن يكون عندك طريقة تعدل خصائص النافذة وأنتا لا تريد أن

يسري التعديل على جميع النوافذ التي تظهر بعد ذلك)

2- المثال السابق لا يمكنك استخدامه في حالة تعدد الخيوط لأنك قد تقوم ببناء الكائن عدة مرات لا مرة واحدة

وذلك قد يحملك كلغة عالية

الحل لهذه المشكلة هي أن تستخدم كلمة synchronized مع الطريقة السابقة

لكن ماذا عن التكلغة الخاصة بهذه الكلمة في ما بعد فهي قد تعطل عملك في ما يلي

لهذا نستخدم تقنية الفحص الثنائي double-check idiom

ذلك أنك تقوم بالفحص بداية ثم تقوم بعملية التزامن synchronization

التي تحتوي على نفس الفحص السابق

المثال التالي يوضح المطلوب

public final class MyFrame extends Frame{

private MessageBox mb_; //null, implicit

private void showMessage(String message)

{

if(mb_==null){//تنفذ عند أول نداء لهذه الطريقة بعد ذلك تهمش بشكل دائم

synchronized(MyFrame.class)

{

//هنا نفحص مرة أخرى لكي نضمن أنه لا يوجد خيط آخر سيقوم ببناء الكائن مرة أخرى

if(mb_==null)

mb_=new MessageBox();//safe

}

}

//set the message text

mb_.setMessage( message );

mb_.pack();

mb_.show();

}

}

نلاحظ أن الفحص الأول يمنع التكلفة الخاصة بالتزامن

والفحص الثاني يمنع التكلفة الخاصة بإعادة بناء الكائن من أي خيط نفذ من الفحص الأول

المراجع حسب الأهمية:

مقال بعنوان Java Tip 67: Lazy instantiation من موقع عالم الجافا

http://www.javaworld.com/javaworld/javatip...-javatip67.html

مقال بعنوان Lazy initialization

http://www.javapractices.com/Topic34.cjp

في النهاية أحب أن أنوه على أن هذا المقال لم يترجم حرفياً من المراجع السابقة

وإنما كان نتاج إطلاع على الموضوع من عدة مقالات عربية وأجنبية في النهاية وجدت أنني

أستسقي غالب أفكاري من هذه المقالات فلم أحب أن أنسب لنفسي ما لم تقم به

المترجم:علاء الصالحي

البريد:alaadiaa1@hotmail.com

سبحانك اللهم وبحمدك واستغفرك اللهم وأتوب إليك

تم تعديل هذه المشاركة بواسطة alaadiaa في 8 أغسطس 2007 في 14:50

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#2

شكراً لك أخي علاء على هذا الشرح..

وهذا هو الأسلوب المستخدم من قبل NetBeans في تهيئة الواجهات ..

فحنوت ألثم جرحه الرعافَ فانتكأت جراحي..

وهمت على خدي الدموع فقلت يا روحي وراحي..

هلّا رحمتَ قلوبنا .. وعدلت عن هذا الرّواحِ ِ ..؟

فأجابني البطل المسجّى هازئاً بيَ .. باقتراحي

كفكف دموعك ليس في عبراتك الحرّى ارتياحي

هذي سبيلي .. إن صدقت محبتي .. فاحمل سلاحي

Sun Certified Java Programmer

#3

شكراً لمرورك أخي د.عبد الرحمن

أتمنى من الله أن تستفيد من المقال

شكراً لك أخ إياد

اشتقنا لطلتك الحلوة معنا في المنتدى

الله معكم

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

هذا الموضوع مغلق.

مواضيع مشابهة