تالار گفتمان nCIS.ir

نسخه‌ی کامل: فاینال بودن یک متغییر
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام
هدف از اینکه یک متغییر رو فاینال می کنیم چیه ؟
مثلا توی این کد

final int p =11;
btn_0.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       edt_result.setText("p"+p);
    }
});
چرا ما نباید بعدا بتونیم p  رو تغییر بدیم؟
بخاطر اینکه نتونیم تغییرش بدیم یا مساوی یه شئ جدید بگذاریمش. فاینال شدنش به این معنا نیست که خصوصیاتش رو مثل text و... نمیشه تغییر داد بلکه خودش رو نمیشه مساوی یه شئ جدید قرار داد (عملگر انتساب دیگه روش کار نمیکنه). علت این موضوع اینه که جاوا میخواد مطمئن بشه که Threadهای دیگه و دستوراتی که داخل Runnableها مینویسید، اشیاء رو دستکاری نمیکنن چون قراره احتمالاً بعدش دوباره توی متد یه کارهایی روی اون عناصر صفحه انجام بشه.

ممکنه با خودتون بگین خوب من که نمیخوام تغییرش بدم ولی جاوا نمیتونه روی احتمالات تصمیم‌گیری کنه. یه زبان سختگیره که نمیگذاره حتی درصورت تمایلتون، برنامه با الگوی بد بنویسید. بنابراین سختگیری میکنه و میگه هروقت یه مقداری رو برای یه Runnable دیگه فرستادین، اون رو final کنین که نتونه دستکاریش کنه.

دقت کنید فاینال شدن فقط عملگر انتساب رو غیرفعال میکنه و ربطی به Propertyهای اشیاء نداره.
گذشته از اینا که مهندس شهرکی گفت، من توی منابعی خوندم که final کردن باعث میشه جاوا بتونه یکسری بهینه سازی های قابل توجهی رو روی کد انجام بده که در غیر اینصورت نمیتونست؛ چون میدونه و تضمین وجود داره که مقدار این متغییرها تغییر نخواهد کرد، پس میتونه یکسری بهینه سازیهایی رو که نیاز به چنین تضمین هایی دارن انجام بده.

پس اینکه متغییرهایی که تغییر نمیکنن رو فاینال کنیم بنظرم از نظر پرفورمنس برنامه مفیده.

البته منکه خودم حال و حوصله ندارم موقع کدنویسی دنبال این چیزا باشم، چون بالاخره توجه و انجام این جزییات وقت و انرژی صرف میکنه که آدم رو از مسائل اصلی و دارای اولویت بالاتر منحرف میکنه. ولی بعدا که برنامه کامل و پایدار شد بنظرم فرصت بهتری برای توجه و انجام اینطور جزییات پیش میاد (البته به شرطی که برنامهء مورد نظر ارزش و نیازش رو داشته باشه).