אנטומיה של מחלקה
הוצג| English | משמעות |
|---|---|
| encapsulation/ɪnˌkæpsjʊˈleɪʃn/ | אקספלציה (איפוק) |
| instance variables/ˈɪnstəns ˈveərɪəblz/ | משתני מופע |
שדות פרטיים עדיין זקוקים לשיטות נבדקות
- לסטודנט יש ציון פרטי, אך
public void setScore(int s) { score = s; }עדיין מאפשר לקורא לספק -5. גישה פרטית לבדה אינה מבטיחה ציון שאינו שלילי. - סטטר מוגן יכול לדחות עדכון זה. בדקו את הקונסטרוקטור וכל שיטה אחרת שכותבת לשדה גם כן; האנקפסולציה מקלה על הכנסת מדינית אימות אך אינה יוצרת אותה באופן אוטומטי.
הפיכת score לפרטית דוחה באופן אוטומטי ארגומנטים שליליים המסופקים למשתתף ציבורי ללא הגנה.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שגוי: המשתתף הוא קוד של המחלקה ויכול להקציר ערך שלילי. יש לבצע אימות.
שלושת חלקי המחלקה
- עיצובי המחלקה הללו מכילים שדות אינסטנס לנתונים, קונסטרוקטורים להגדרה ראשונית, ושיטות להתנהגות. אלו שלושה חלקים מועילים לזיהוי; פורמלית, Java אינה מדרגת קונסטרוקטורים כחברי מחלקה.
- עקבו אחר סטודנט מההקמה ועד עדכון: הקונסטרוקטור מזין את שדה הציון שלו, ושיטת אינסטנס בקרוב קוראת או משנה את ציון האובייקט הזה. שיטה סטטית, לעומת זאת, אין לה אובייקט נוכחי אימפליציטי.
משתני מופע מחזיקים מצב
- משתני מופע מאחסנים את ה-מצב הייחודי של כל אובייקט.
private String name; private int score;— מוגדר בתוך הקלאס, מחוץ לכל שיטה.- לכל אובייקט יש עותק משלו — ה-
scoreשל תלמיד אחד נפרד מזה של השני. - משתנים אלו קיימים לאורך חיי האובייקט (לעומת משתנים מקומיים).
פרטי וציבורי
- מודפי גישה קובעים מי יכול לגשת לחבר.
private— ניתן לשימוש רק בתוך המחלקה;public— חשוף לקוד אחר שיכול לגשת למחלקה.- משתני מופע הם בדרך כלל
private; שיטות המרכיבות את הממשק הןpublic. - הסתרת הנתונים הפנימיים נקראת אנקפסולציה.
איזה שלושה חלקים מארגנים את עיצוב מחלקת Student הנלמד כאן?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שדות מופע שומרים על מצב, בונים מעצם (constructors) מאיירים אובייקטים חדשים, ומתודות מספקות התנהגות. לפי הנחלת המונחים ב-Java, בונים אינם נחשבים כחלקים רשמיים של מחלקה.
משתני מופע בדרך כלל מוגדרים...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
נתונים פרטיים + שיטות ציבוריות = אקפסולציה.
שמירה על נתונים כפרטיים וחשיפתם רק דרך שיטות נקראת ___ (מילה אחת).
Difficulty 1/5 · 100 coins + a small bonus on first completion today
אקפסולציה מגנה על הנתונים של אובייקט.
שני אובייקטים מאותו מחלקה חולקים העתקה אחת משכל משתני המופע.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
לכל אובייקט יש העתקה עצמאית של משתני המופע.
למחלקת Student ברמה העליונה המוצגת כאן, ייתכן שמחלקה חיצונית שאינה קשורה תאפשר קריאה ישירה לשדה פרטי...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
גישה פרטית מונעת ממחלקה חיצונית שאינה קשורה לקרוא את השדה ישירות. קוד בתוך Student יכול לקרוא לשדה פרטי של אובייקט Student אחר.
מדוע לשמור על נתונים כפרטיים
- האנקפסולציה מונעת מקוד חיצוני בלתי רלוונטי להעניק ישירות לשדה פרטי. קוד בתוך Student עדיין יכול לקרוא או לכתוב לשדות פרטיים, כוללAS those of another explicitly referenced Student.
- חיצוניים מתאימים רק דרך שיטות ציבוריות, שיכולות לאמת ולשלוט בגישה.
- ניתן לסרב לקבלת ציון שלילי בתוך שיטה; משתנה ציבורי אינו מספק הגנה כזו.
- שדות פרטיים עם ממשק ציבורי שנבחר במתכונת תומכים בעדכונים מבוקרים. כל שיטה וקונסטרוקטור צריכים עדיין ליישם את הכללים המתכוונים; החזרת אובייקט פנימי משתנה יכולה גם לחשוף שינויים באופן עקיף.
שמרו על משתני אינסטנס private; חשפו התנהגות דרך public שיטות. שדה public מאפשר לכל קוד להעניק לו כל ערך (ציון שלילי, שם null) ללא בדיקות. האנקפסולציה מפנה את כל הגישה דרך שיטות שיכולות לאמת את השינוי. לכל אובייקט יש אחסון משתני אינסטנס נפרד, אך שדות הפניה באובייקטים שונים עשויים להפנות לאותו אובייקט משותף. הבדילו בין שדות נפרדים לבין אובייקטים מופנים נפרדים.
לשני אובייקטים ישנו שדות הפניה נפרדים, ולכן שדות אלו חייבים להפנות לאובייקטים שונים.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שגוי: שדות הפניה נפרדים יכולים להפנות כולם לאותו אובייקט משתנה.
שני סטודנטים מתייחסים לאותו ArrayList ריק בהתחלה. אחד מהם מוסיף פריט בודד. מהו גודל הרשימה שהאחר מתייחס אליו?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
שתי ההפניות מצביעות על אותו אובייקט רשימה, שעכשיו גודלו 1.
אנטומולוגיה של מחלקה Student:
- משתני מופע:
private String name; private int score; - בונה:
public Student(String n) { ... } - מתודות:
public void addScore(int s) { ... },public int getScore() { ... }
הפרדת אחסון שדות מאובייקטים משותפים
- אם שני אובייקטי Student שומרים both reference לאותו ArrayList, שדות הרשימה שלהם נפרדים אך הרשימה המופנשת משותפת. הוספת פריט דרך אחת ההפניות משנה את אותה רשימה אחת.
- שינוי הפניה של שדה הרשימה של סטודנט אחד לאArrayList חדשה משנה רק את השדה הזה. עקבו אחרי חצים של הפניות כאשר תחזית מצב; גישה פרטית ומזהות אובייקט עונים על שאלות שונות.
לקלאס יש משתני אובייקט (המצב של כל אובייקט), קונסטרוקטורים (הגדרת אובייקטים חדשים) ו-מתודות (התנהגויות). משתני אובייקט הם בדרך כלל private ומגיעים דרך מתודות public — העטיפה הזו מגנה על הנתונים. לכל אובייקט יש שדות אובייקט נפרדים; האובייקטים המופנים על ידי השדות הללו עשויים עדיין להיות משותפים.
לכל אובייקט יש מצב משלו
a.score ו-b.score הם נפרדים — כל אובייקט שומר על המצב שלו.