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

ما الفائدة من الكود final

بدأه IsuRaMu في 14 يوليو 2010 · 11 رد · 921 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

في كتاب كنت اتعلم منه لغة الجافا والكتاب قديم قليلا اذا انه 2th Edition كان يكتب كودloop بهذه الطريقة

public class program1 {

	public static void main(final String args[]){
		int counter = 1;
		while (counter <= 6){
			System.out.println(counter);
			counter = counter + 1;

		}		
	}
}

ما لم افهمه لم استخدم الكود final اذا كان وجوده او عدمه لا يشكل فرق في السطر التالي

public static void main(final String args[])

فارجوا من اهل الخبرة ان يشرحوا لي ما الفائدة من هذا الكود ؟؟؟

تقبلوا تحياتي وشكرا

IsuRaMu

#2

تتم اضافة عبارة final للمتغيرات للحفاظ عليها من التغيير

اولا عند تكوين متغير امتداد لنوع object مثل ال String فأنه يصبح يؤشر على موقع هذا المتغير بالذاكرة من خلال عنوان الذاكرة لتلك المنطقة (مثل ال Pointers في ال C++)

و يصبح اسمه Reference Object

String myName = new String("Mohammed");

حاليا تعتبر myName هو Reference Object لكائن من نوع String و قيمته "Mohammed" في الذاكرة

و يؤشر عبه من خلال عنوان

عند عمل التالي :

myName= new String("Esam");

فأن myName فعليا اصبحت تؤشر على كائن اخر في الذاكرة ذو قيمة مختلفة في الذاكرة

و لكن عند اضافة final لهذا ال Reference Object فأنه لا يمكن تغيير قيمة المؤشر الذي يؤشر على الكائن في الذاكرة و بذلك نحافظ على هذا الكائن من التغيير.

__ لماذا قد تستخدم مع المتغيرات في الدوال : كدالة main

احيانا قد نستخدم صف داخلي في الدول

مثلا استخدام Thread جديدة

 public static void main(String args[]) {
        new Thread(new Runnable() {

            public void run() {
                //***
            }
        }).start();
    }

و لاستخدام قيمة المصفوفة في الدالة run

فانه يجب ان يكون من نوع final

وهذه تعتبر من انواع الحاية للمتغيرات بحيث يكون لل inner classes امكانية الوصول للمتغيرات في الدوال و التغيير في قيمها

مما قد يسبب اضطراب في القيم لما يوجد ايضا جُمل اخرى تستطيع الوصول الى نفس النتغيرات

و بذلك نحمي برنامجنا من هذه الاضطرابات بوضع final بجانبها في بعض الدوال.

لكن استخدام final بجانب المتغيرات الممررة للدوال لا يؤثر على المتغيرات الاصلية.

1
#3

إنظر هذا الرابط:

http://www.javalobby.org/java/forums/t84151.html

اقتباس

1. It lets other programmers know that this variable shouldn't be changed or assigned another value.

2. It stops you accidentally changing the value

3. It helps stop accidentally assigning the wrong value bugs e.g. typos etc.

4. It stops people overriding classes when you don't want them to or they shouldn't

وسائط الدالة (parameters ) يفضل أن تكون final , أي أنك لا تستطيع تغيرها في الداله .. و في هذه الحالة ,,, لا يجب أن تقوم بتغيرها, بل بقرائتها فقط..

1
#4

في الكود الذي اوردته في السؤال هل هناك سبب في كتابة final ام ان مؤلف الكتاب كتبها من باب انه فنان :P

#5
IsuRaMu كتب:

في الكود الذي اوردته في السؤال هل هناك سبب في كتابة final ام ان مؤلف الكتاب كتبها من باب انه فنان :P

كما اوضح لك سيد هويدي فأنه وضح سلوكيات برمجية يستحب استخدامها للوصول الى الاحترافية في كتابة البرمجيات

و بذلك تعتبر سلوكيات يتبعها المبرمج بنائا على شرحي لها من ناحية تقنية

تم تعديل هذه المشاركة بواسطة محمد عرسان في 14 يوليو 2010 في 12:05

#6

@محمد عرسان:

ألا تعتقد لها أي تأثير في تحسين الأداء؟ لقد بحثت كثيرا و لم أجد شئ يدل على هذا,, فقط وجد علاقة بين ال final و ال inline methods

بالمناسبة,, كما تعلمون, أن final في الجافا مع ال references هو const pointer , وليس const value ... (قد قرأت من قبل أنهم يحجزون الكلمة const في الجافا لتمثل const values لل references ) للمذيد

شكرا لك يا شريكي و شكرا لكم جميعا :D

#7

اخى الكريم السائل عن final

انت تضعها فى حين انك تريد ان تاخذ القيم بتاعت الـ parameters قيم ثابته مش هتغير فيها

يعنى انت عاوز تاخدها كبيانات وليس متغيرات تغير عليها

يعنى لم تحتاج انك تاخد البيانات من غير ما تغير فيها

تخلى الـ parameters من نوع final

زى المثال الذى وضعته

ومن المستحب كما قال اخى هويدى ان تاخذها ثابته يعنى علشان محدش يغير فى القيم اللى انت واخدها

من كائن اخر او داله اخرى

انما هنا اعتقد انه كاتبها ليعلمك ان هناك final للقيم اللى انت بتاخدها

Software Developer
Mahmoudkelany.com


 

#8
اقتباس
يعنى انت عاوز تاخدها كبيانات وليس متغيرات تغير عليها
+1

أستاذ, أستاااااذ :D

#9
هويدي كتب:

+1

أستاذ, أستاااااذ :D

اقولك الصراحه ؟

بجد انا كنت متعكنن بس لم شوفت ردك فضلت اضحك

ليه علشان اقولك ربنا يخليك

مش بضحك عليك لا والله

بس الرد ضحكنى

ربنا يخليك يا اخ هويدى

Software Developer
Mahmoudkelany.com


 

#10

مفيش حاجه في الدنيا تستاهل إن الواحد يضايق,,, كل حاجه في الدنيا دي, بتروح و تيجي :)

#11
هويدي كتب:

مفيش حاجه في الدنيا تستاهل إن الواحد يضايق,,, كل حاجه في الدنيا دي, بتروح و تيجي :)

ماشى يا اخ هويدى

هاعمل بالنصيحه حاضر :)

Software Developer
Mahmoudkelany.com


 

#12

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

سأضيف شئ الى كلام اخواني الذين اضافوا الكلام السابق

final عندما نككتبها امام المتغير تعني ان هذا المتغير لن نستطيع ان نغير قيمته

مثلأ

اذا كان عندك متغير قيمته لن تتغير بعد ذلك باي عندما نحسب محيط دائرةاو مساحتها

area= 22/7 * r

هنا ممكن اخلى 22/7 ثابته -اي لاتتغير قيمته بان اعرفها كالتالي

finat int t=22/7;

,

final عندما نضيفها امام class فهذا يعني ان هذه ال class لن نستطيع ان يرث منه اي class اخر

وعندك مثال على هذا هو ال string class

فهذا ال class لا يمكنك ان ترث منه

اتمنى ان اكون اوضحت ما اريده

وجزاكم الله كل خير

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