[dropcap]static[/dropcap]كلمة مفتاحية مشهورة جداً في لغة الجافا، هذه الكلمة تُستخدم بكثرة في لغة الجافا في أوساط المبتدئين و المحترفين على حد سواء. و لكن الإستخدامات الخاطئة لـ static كثيرة جداً و مشهورة. ربما يرجع ذلك لقلة المعرفة عن أهمية الكلمة static و لماذا تستخدم، و هو الذي لن تُعاني منهُ بإذن الله إذا تعلمت و طبقت ما هو موجود بهذه التدوينة.
لماذا static
تؤدي static مهمة رائعة جداً فيما يتعلق بالذاكرة، فهي تساعد المبرمج على إنشاء نظام فعال في إستخدام الذاكرة، أي يقلل من إستخدام الذاكرة. و ذلك لأن كل متغير أو دالة أو غيره تم تعريفه بأنه static فذلك يعني أن هذا المتغير -فلنقل- سيتم حجز مكانه في الذاكرة لمرة واحدة فقط.
كما هو من المهم جداً صديقي أن تعرف أن المتغيرات و الدوال التي يتم تعريفها بـ static هي تتبع الـ class و ليس الـ object. و هذا يعني أن كل متغير -فلنقل- عرّفتهُ بأنه static فبإمكانك الوصول إليه دون أن تُنشئ object عن الـ class. فقط تحتاج إلى أن تستخدم هذه العبارة
classname.StaticElementName;
ففي البرنامج التالي أنادي المتغير name و الذي يمثل إسم الطالب، و أغير قيمته دون أن أُنشئ object.
public class CallStatic { public static void main(String args[]) { Student.name = "Ahmed"; System.out.print(Student.name); }//end main } class Student { static String name; }
مُخرج هذا البرنامج هو Ahmed.
أنقلك الآن إلى الإستخدامات المُفيدة جداً لـ static و التي من أجلها وجدت static، هذه الإستخدامات يجب أن تضعها نصب عينيك دائماً في كتابتك لشفراتك، فمثل هذه الإستخدامات هي ما يصنع الفارق بين المحترف و الهاوي.
إستخدم static لتعريف المتغيرات غير القابلة للتغيير منطقياً
كثيراً ما تجدا متغيرات محددة القيمة داخل الفئة ومعرفة بـ final و لكنها غير معرفة بـ static وفي نفس الوقت قيمتها لن تتغير اطلاقاً طوال حياة البرنامج. فلماذا لا تجعلهُ مشتركاً و توفر المساحة بالذاكرة و تُظهر احترافيتك.
إستخدم static مع الدوال التي من المنطقي إستخدامها قبل إنشاء object
إذا أردت أن تنشئ class لسيارة، فمن الدوال التي يجب أن تضعها static مثلاً الدالة التي تغير وحدات قياس السرعة بين كيلومتر و ميل. فهذه الدالة قد تستخدمها بدون إنشاء الـ class لإجراء أي تغيير، و حتى بدون أن تمتلك سيارة بمعنى آخر، أما الدوال مثل سرعة السيارة الحالية فيجب أن لا تعرف كـ static لأنها متعلقة بكل سيارة لوحدها.
لإجراء تغييرات على متغير static، أنشئ دالة static
ليس دائماً، و لكن الشرط هو أن تكون لديك عمليات معقدة تجريها على متغير static، ففي هذه الحالة أنشئ دالة من النوع static حتى تستطيع أن تستدعيها دون أن تنشئ object، فالمتغير الـ static بالإمكان تغييره و إسناد قيمة له و تعديلها دون أن ينشأ أي object.
إستخدم static مع المتغيرات المُشتركة بين الـ objects
إبحث دائماً عنن المتغيرات المشتركة بين الـ objects، هذه المتغيرات إذا ما تغير في أحد الـ classes سوف تتغير في البقية،عند تعريفك لـ class يخص طالب في جامعة، فمن المتغيرات التي يجب أن تعرف بـ static إسم الجامعة و تاريخ إنشاءها، لماذا؟ هذه المتغيرات غير قابلة للتغيير على مستوى الطلاب، فإذا أنشأت عدة objects فلن يتغير إسم الجامعة، أليس كذلك؟ و هنا تأتي فائدة static بأنه مهما كان عدد الـ objects تبقى المساحة المحجوزة للمتغير الخاص بإسم الجامعة واحدة، و لكن المتغيرات مثل إسم الطالب و عمره يتم إنشاءها مع كل object لوحده.
إستخدم static مع الدوال غير المتعلقة بالـ object
توجد بعض الدوال التي لا تتعلق بالـ object الذي سيتم إنشاؤه، و لكن يتم إنشاؤها كدوال مساعدة، ليس بالضرورة أن تكون هذه الدوال من النوع الذي يُستدعى قبل إنشاء الـ object كما ذكرتُ لك سابقاً، بل أي دالة مساعدة غير متعلقة بالـ object إجعلها static لتوفر بعض المساحة بالذاكرة.
هذه 5 أفكار و استخدامات لـ static لتعتمدها أو لتتبناها في طريقة تفكيرك عند إنشاء أي برنامج، و ضمنياً توضح هذه الإستخدامات فوائد و أسباب وجود static في لغة الجافا، إذا أعجبت الأفكار إضغط على و اكتب إنطباعك عن هذه الأفكار.
تدوينات مفيدة لك:
ابسط شرح للتمرير بالمرجع و التمرير بالقيمة مع حيلة لتعمل الجافا بالتمرير بالمرجع
بارك الله بيك استاذ
لو سمحت ممكن امثلة عن الموضوع
جميل جداً الله يجزيك الخير توضحت الافكار بعدما كنت مخربط وضائع
ممكن سؤال لماذا لا تعمل مينمثود عند إزالة الستاتيك
أوه! توجد العديد من الأسباب. معرفة السبب الحقيقي تعتمد على مراجعة الشفرة المصدرية مع العلم أن وجود Static ليس ضرورياً في جميع الدوال.
رائع جدا الشرح الله يوفقك الى كل خير
شكراً لك محمد.
الله يبارك فيك على المعلومات الرائعة
سلام و شكرا
كما ذكر حسام لا يمكن ربط مفهوم final و static
الامر واضح حين تستمل المتغيرات في lamda فانك مجبر الى ان يكون المتغير final داخلها.
انظر https://stackoverflow.com/questions/34865383/variable-used-in-lambda-expression-should-be-final-or-effectively-final/34866174#34866174
مرحباً عبده، يبدو أن العبارة الأولى لم تعبّر تماماً عن المُراد. حدّثتُ العبارة علّها تكونُ الآن أوضح.
ايهما افضل ابدا بلغة الجافا ام الc++وماهو الفرق بين الجافا والجافا سكربت أرجو الرد
بارك الله فيك أخ مصطفى، حقيقة كان لدي بعض الإلتباس في استخدام static وقد زال بعد قراءة المقال .
لك جزيل الشكر . 👍👍👍
شكراً لك أخي محمد، يسعدني ذلك 🙂
بارك الله بك وبعلمك ونفع بك الله الاسلام والمسلمين
وبارك فيك عمار 🙂
احينا يلزم امثلة حية كي توصل الفكرة وهذا ما استخلصته ولاحظته شكرا لك مثل موضوع الجامعة
بالتأكيد . بالمثال يتضح المقال.
مقالة رائعة ومفيدة لفت أنتباه لبعض الأمور وتوفير مساحات في الذاكرة وفي حجم المشروع أيضاً
أسعدني ذلك. أتمنى لك التوفيق قائد.
جزاك الله خيرا
مصطفى
واياك عمر
السلام عليكم
بالنسبه للنقطه اﻻولى اختلف معك فيها بشكل بسيط
ليس بالضروره تعريف الfinal على انه static
الا في حاله وحده يفضل تعريفه على انه static اذا تم عمل initialization بشكل مباشر لل final
لكن في حالة عدم initialization بشكل مباشر من الممكن عدم تعريفه على انه static وبالتاليى نسمح لكل instance بعمل initialization مناسب له
وعليكم السلام ورحمة الله وبركاته حسام،
واختلافنا في الكود لا يُفسد للود قضية 🙂 منطقياً وبرمجياً حديثُك صحيح ومكملٌ للنقطة الأولى.
شكراً لك على هذا الايضاح.
يعطيك الف عافية
استمر…
الله يعافيك محمود، سلمت