ورود

View Full Version : تغییر دادن فیلد های final



a.seieddokht
جمعه 28 تیر 1392, 00:26 صبح
سلام به همه دوستان
میخواستم بدونم چطور میشه فیلد های final رو تغییر داد این کار درست نیست و در حالت عادی شدنی نیست من خودم میدونم از راه method constructor میشه فیلد final رو initial کرد ولی منظورم اون نیست چون من میتونم متد ها و فیلد های private رو از بیرون کلاس call کنم با RO پس حتما باید بشه که مقدار فیلد final رو تغییر داد با RO بدون این که خطا cannot assign a value of final varibale رو داد من تا یه جاییشو تونستم ولی Exception داد
ممنون میشم کمک کنید:لبخندساده:

cups_of_java
جمعه 28 تیر 1392, 00:46 صبح
اصن final یعنی متغیر ثابت! یک بار مقدار بهش داده میشه و همون باقی می مونه! دوباره شما نمی تونی مقدار بدهی بهش.

a.seieddokht
جمعه 28 تیر 1392, 02:29 صبح
اصن final یعنی متغیر ثابت! یک بار مقدار بهش داده میشه و همون باقی می مونه! دوباره شما نمی تونی مقدار بدهی بهش.

بله میدونم constant هستش من هم میدونم نمیشه ولی با RO کار نشد نداره میخوام بدونم چطوری میشه با Ro این کارو کرد ممنون:لبخندساده:

a.seieddokht
جمعه 28 تیر 1392, 04:47 صبح
من تونستم با RO فیلد های static final رو تغییر بدم ولی هرکاری کردم نشد final رو تغییر بدم :افسرده::عصبانی++::گریه: یجاش مشکل داره که من خبر ندارم ولی این کار شدنی از دوستان اگه کسی RO بلده کمک کنه ممنون:لبخندساده::تشویق:

cups_of_java
جمعه 28 تیر 1392, 12:31 عصر
RO چی هست؟

a.seieddokht
جمعه 28 تیر 1392, 18:54 عصر
RO چی هست؟


ببخشید خلاصه نوشتم منظورم Reflection هست
RO = Reflect Oriented
:لبخندساده::چشمک:

cups_of_java
جمعه 28 تیر 1392, 20:39 عصر
با Reflection یه کار هایی میشه کرد، اگه از setAccessible استفاده کنید میتونید اون متغیر رو به حالت Public و یا غیر final در بیارید و اون وقت تغییرش بدین.
اما استفاده از این مکانتیزم توصیه نمیشه چون تو شرایطی ممکنه کار نکنه.

import java.lang.reflect.Field;


public class Test {

public static void main(String[] args) throws Exception {
WithPrivateFinalField pf = new WithPrivateFinalField();
System.out.println(pf);
Field f = pf.getClass().getDeclaredField("s");
f.setAccessible(true);
System.out.println("f.get(pf): " + f.get(pf));
f.set(pf, "No, you’re not!");
System.out.println(pf);
System.out.println("f.get(pf): " + f.get(pf));
}

private static class WithPrivateFinalField {
private final String s;

public WithPrivateFinalField() {
this.s = "I’m totally safe";
}
public String toString() {
return "s = " + s;
}
}

}

a.seieddokht
یک شنبه 30 تیر 1392, 02:31 صبح
سلام اقا دستت درد نکنه ممنون منم همه این کارارو انجام میدادم ولی مشکل اینجا بود که از خود instance object مقدار فیلد رو میبردم خروجی و میدیدم که تغییر نکرده و این کار اشتباه و با کد بالا فهمیدم باید از متد get استفاده کرد
خیلیییییییی ممنوننننننننن:لبخندساده::ق قهه:

a.seieddokht
یک شنبه 30 تیر 1392, 12:06 عصر
اقا من به هدفم نرسیدم من هدفم از این که میخواستم final رو تغییر بدم این که بتونم فیلد length ارایه رو تغییر بدم (یعنی به انتهای ارایه اضافه کنم ازش کم کنم و این کارا بدون استفاده از ArrayList ) که دیدم نمیشه یعنی فیلد final رو کامل تغییر نمیکنه حتما باید متد get رو بزنیم تغییر واقعی یعنی این که من بتونم اسم فیلد از شی رو بزنم و ببینم تغییر کرده مقدارش:گریه::قهقهه: