ورود

View Full Version : دلیل استفاده از final در این کد



passerby
سه شنبه 27 مرداد 1394, 20:26 عصر
سلام دوستان. لطفا بفرمایید دلیل اینکه باید et رو final تعریف کنیم چیه. لطفا دلیل را روشن و واضح بفرمایید. متشکرم.


final EditText et=(EditText)findViewById(R.id.t);
Button b=(Button)findViewById(R.id.b1);
b.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v)<br>
{
Intent on=new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+et.getText()));
startActivity(on);
}
});

Nevercom
چهارشنبه 28 مرداد 1394, 03:54 صبح
اگر توجه کنید پارامتر متد setOnClickListener شکل خاصی داره، درواقع یک کلاس را همونجا داریم Instanciate میکنیم. به این کلاس Anonymous Inner Class میگیم (در ادامه بهش میگیم کلاس داخلی، و به کلاسی که این کدها توش نوشته شده اسم کلاس اصلی رو میدیم).

برای اینکه کلاس داخلی به متعیر هایی که در کلاس اصلی تعریف شده باشن و در کلاس داخلی استفاده شده باشن (مثل et)، دسترسی داشته باشه، یک کپی از مقدار اون متغیر رو هنگام ایجاد کلاس داخلی رو برای خودش ایجاد می کنه.

خب حالا ممکنه یک مشکل بوجود بیاد، در این مثال ممکنه متد onClick از کلاس داخلی با فاصله ی زمانی از ایحاد کلاس اصلی اجرا بشه، از اونجایی که کلاس داخلی یک کپی از متغیر (et) رو برای خودش ایجاد کرده، اگر این امکان وجود داشته باشه که بتونیم در اون متغیر تغییراتی ایجاد کنیم، عملاً این دو متغیر (متغیر et در کلاس اصلی و کپی اون در کلاس داخلی) ممکنه در زمان خاصی مقدار متفاوتی داشته باشن.

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