ג'אווה

Fingertip

New member
ג'אווה

סתם קטע מעצבן (ונחמד) שקרה לי היום בג'אווה במהלך כתיבת אחת המטלות. אשמח לשמוע מה דעתכם. כתבתי את קטע הקוד הבא: (אני מקווה שהוא ברור גם בלי ההקשר)
private ActionListener Handlers []; private void initHandlers () { Handlers = new ActionListener [SHAPE_AMOUNT]; for (int i ShapeIndex.FIRST_NON_FILLABLE - ShapeIndex.FIRST; i <ShapeIndex.LAST_NON_FILLABLE - ShapeIndex.FIRST; i++) Handlers new ActionListener () { public void actionPerformed (ActionEvent e) { items.setSelected (true); buttons.setSelected (true); filledItem.setEnabled (false); filledBox.setEnabled (false); filledItem.setSelected (false); filledBox.setSelected (false); } }; for (int i ShapeIndex.FIRST_FILLABLE - ShapeIndex.FIRST; i <ShapeIndex.LAST_FILLABLE - ShapeIndex.FIRST; i++) Handlers new ActionListener () { public void actionPerformed (ActionEvent e) { items.setSelected (true); buttons.setSelected (true); filledItem.setEnabled (true); filledBox.setEnabled (true); } }; }​

וזה גרם להודעת שגיאה:
PainterView.java:196: local variable i is accessed from within inner class; needs to be declared final items.setSelected (true); ^ PainterView.java:210: local variable i is accessed from within inner class; needs to be declared final items.setSelected (true); ^ 2 errors​

אחרי שנייה מחשבה הוספתי hack קטן בשביל לתקן את הבעיה. את i הפכתי לגלובלי ויצרתי פונקצית גישה getIndex שמחזירה את ערכו. בתוך כל אחת מהמחלקות האנונימיות פשוט יצרתי משתנה final שיאותחל לערך שמוחזר על ידי getIndex. כמה חבל שאין בג'אווה ג'נריות (או אפילו דיסקרימיננטות). אהד.
 

Fingertip

New member
הבעיה

הבעיה היא שאני משתמש במשתנה לוקלי מתוך הגדרה של מחלקה אנונימית. אני חושד שזה קשור לעובדה של-C (ולכן לג'אווה) אין scope אמיתי וכל משתנה נמצא ב-scope גלובלי או לוקאלי. לפיכך אי אפשר להשתמש במשתנה מקומי (הגדרה לוקלית) בתוך הגדרה של מחלקה אנונימית (הגדרה גלובלית בעיקרה). מצד שני, ייתכן שאני מדבר שטויות. בכל מקרה, יש בעיה כי הוא מעלה שגיאות. אהד.
 

voguemaster

New member
רק שניה

המשתנה הזה לוקאלי לאיזו מחלקה ? ומה זה מחלקה אנונימית ?? לא שמעתי על זה ...
 

Fingertip

New member
לאף מחלקה...

הוא לוקלי לפונקציה initHandlers. מחלקה אנונימית היא מחלקה שאין לה שם שמממשת ממשק:
new InterfaceName () { // annonymus class implementation };​
אהד.
 
למעלה