פורסם 2012 במאי 113 שנים אני לומד קורס ג'אווה בפתוחה ובתרגילים תמיד מזהירים אותנו מ-alasing איך אני יודע איפה לזהות אותם בבנאים (שם הנק' הקריטיות נמצאות ?) ?
פורסם 2012 במאי 113 שנים בכל מקום שאתה מחזיר או מאתחל אובייקט עשה לך נוהג ותמיד תחזיר \ תאתחל באמצעות new ובנאי כלשהו של המחלקה שאליה האוביקט שייך.
פורסם 2012 במאי 113 שנים מחבר למשל משהו כזה: public class test { public string _str; public test(string str) { _str = str; } }
פורסם 2012 במאי 113 שנים מחבר אין בעיה אני פשוט רוצה לדעת איך אני נזהר ה-alasing ואיפה לשים לב לא לעשות \ נק' בעיתיות כו'
פורסם 2012 במאי 213 שנים יכול להיות שהתכוונת ל aliasing?כי אם כן, אז דווקא בקוד שנתת אין בעיה כזו, מכיוון שבג'אווה, פרמטרים עוברים by value ואין סכנה ששני המשתנים יצביעו על אותו שטח בזכרוןהבעיה יכול להיות אפשרית אם למשל אתה מעביר בפרמטר collection ומנסה לשלוף אחד מהערכים שבו למשלpublic class Test{ public string _str; public Test(List<String> l) { _str = l.get(0); }}עכשיו המשתנה הפנימי מצביע על אותה מחרוזת בדיוק שנמצאת באיבר הראשון ברשימה שעברה כפרמטר לבנאיוד"א, תתרגל להשתמש תמיד בקונבנציית השמות, אפילו בדוגמאות טריוויאליות (שם המחלקה צריך להתחיל באות גדולה)
פורסם 2012 במאי 213 שנים א. גם בקוד הזה אין שום בעיה (למעשה הוא כמעט זהה לקוד ש-gal_i50 פרסם).ב. בג'אווה רק פרימיטיביים עוברים by value, כל השאר עובר by reference.
פורסם 2012 במאי 213 שנים שניצלא. כן זה נכון שבקוד אין בעיה, אולם זה בגלל שהרשימה מכילה מחרוזות ואלו מוגדרות immutable ע"' הקומפיילר, כלומר בהרבה מקרים המחרוזות כלל לא ישבו בheap. אם למשל הרשימה היתה מחזיקה Date אזי היתה לנו בעיה -public class Test{ public Date _date; public Test(List<Date> l) { _date = l.get(0); } public static void main(String[] args) { List<Date> l = new ArrayList<Date>(); l.add(new Date(10000)); Test t = new Test(l); System.out.println(t._date == l.get(0)); System.out.println(l.get(0)); System.out.println(t._date); l.get(0).setDate(2000); System.out.println(t._date == l.get(0)); System.out.println(l.get(0)); System.out.println(t._date); }}outputtrueThu Jan 01 02:00:10 IST 1970Thu Jan 01 02:00:10 IST 1970trueMon Jun 23 02:00:10 IDT 1975Mon Jun 23 02:00:10 IDT 1975הנה הצלחתי לשנות את הערך של משתנה המחלקה _date מבלי להתייחס אליו ישירות (דרך שינוי האיבר ברשימה)וזו בדיוק הדגמה של aliasingב. זה נכון באופן חלקי בלבד. במקרה של אובייקטים, ג'אווה מעביר את המצביעים by valueהסבר מלא אפשר למצוא במאמר הזהhttp://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
פורסם 2012 במאי 213 שנים א. נכון, אבל מה ההבדל כאן בין להעביר רשימה לבין להעביר אובייקט בודד מסוג Date?ב. צודק, התכוונתי שהאובייקטים עצמם עוברים by reference, והמצביעים להם עוברים by value.
פורסם 2012 במאי 213 שנים נכון, אפקט aliasing מתקיים גם באובייקט בודד של Dateלמען פותח השירשור אסכם את הנושא כך:aliasing פירושו השמה של שניים או יותר מצביעים לאותו אובייקטמכאן משתמע שאין כלל אפשרות לaliasing במשתנים פרימיטיביים ואוסיף שגם במחרוזות מעצם טבען המיוחד בג'אווה (immutable)השמה כזאת בטעות תקרה לרוב בזמן העברת ארגומנטים למתודה (לא חייב שתהיה בנאי בהכרח) והשמה למשתנה מחלקה.ה"טעות" שקורית במקרה הזה היא שאחרי ההשמה, משנים את ה internal state של האובייקט דרך אחד המצביעים מבלי לקחת בחשבון שההשפעה תורגש גם דרך המצביע השני.ולמען המפתחים המתקדמים בינינו אוסיף שזו אחת מהטעויות שאינה מתקיימת בשפות תכנות פונקציונאליות (functional programming) מכיוון שקיימת שם דרישת סף שכל פונקציה (=מתודה) לא תשנה שום משתנים שאינם לוקאליים.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.