» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
ביצוע סיום
דף ראשי  מתחילים  חברים בהֵדגֵם, חברים במחלקה, בנאים וביצוע סיום  ביצוע סיום גרסה להדפסה

 

ביצוע סיום

 

ביצוע סיום הוא נושא מורכב הרבה יותר מכפי שספרים מסוימים יגרמו לך להאמין.
הדבר יהיה ברור למתכנתי ++
C, המכירים את מושג ההורס כפי שהוא משמש ב‑++C.

 

מומלץ מאוד לעיין ב"ספר המתהווה" Thinking in Java http://www/eckelobjects.com,
הנכתב בידי
Bruce Eckel.
הקדש תשומת לב מיוחדת לדיון בנושא השמדנים של ++
C ומתודת finalize ב‑Java.

הדיון שלהלן מבוסס בעיקר על The Java Tutorial by Campione & Walrath,
החלש יותר בנושא מתודת
finalize ביחס להערות של Bruce Eckel.

 

לכל אובייקט יש מתודת finalize, אשר יורשת מתוך מחלקת Object.
לפני שאובייקט נתבע על ידי אוסף האשפה, נקראת מתודת
finalize של אותו אובייקט.

 

אם דרוש לך לבצע פעולות ניקוי הקשורות לניהול זיכרון, תוכל לדרוס את מתודת finalize ולשים את קוד הניקוי שלך באותה מתודה.

 

אם דרוש לך לבצע פעולות ניקוי שאינן קשורות לניהול זיכרון לפני שהאובייקט נתבע,
ואינך נחפז לבצע את הניקוי, תוכל להפעיל את
runFinalizersOnExit() במועד מוקדם יותר בתוכנית, לדרוס את מתודת finalize, ותוכל להיות משוכנע שביצוע סיום לגבי האובייקטים שלך יתרחש לפני סיום התוכנית.

 

שים לב, שב‑1.1 JDK נוספו שתי המתודות הבאות כדי להתמודד עם חוסר הוודאות המסוים שהיה קיים ב‑1.0.2 JDK לגבי ביצוע סיום.

 

·       runFinalizersOnExit(boolean). מתודה מסוג static במחלקה java.lang.Runtime.
מאפשרת או מונעת ביצוע סיום ביציאה. הפעלת המתודה מציינת שה‑
finalizers של כל האובייקטים בעלי finalizers, כאלה שלא הופעלו אוטומטית, ירוצו לפני היציאות בזמן ריצה.

·       runFinalizersOnExit(boolean). מתודה מסוג static במחלקה java.lang.System.
מאפשרת או מונעת ביצוע סיום ביציאה. הפעלת המתודה מציינת שה‑
finalizers של כל האובייקטים בעלי finalizers, כאלה שלא הופעלו אוטומטית, ירוצו לפני היציאות בזמן ריצה.

 

ב‑Java, אם אתה זקוק לקוד ניקוי שיבוצע על פי עיתוי, זוהי אחריותך לכתוב מתודות מיוחדות לניקוי שאינו ניקוי זיכרון, ולבצע את אותן מתודות ברגעים המתאימים בזמן.

 

finalize איננה הורס

 

מתכנתי ++C חייבים לזכור, שמתודת finalize ב‑Java איננה ההורס של ++C. ההורס ב‑++C
(אם קיים כזה) מופעל תמיד כאשר אובייקט חורג מהטווח או מושמד בדרך אחר
(למשל, תוך שימוש באופרטור
delete כדי להשיב את הזיכרון, שתפס עד אז האובייקט, למערכת ההפעלה).

אף על פי שב‑Java מתודת finalize מופעלת תמיד לפני שאוסף האשפה תובע את הזיכרון,
אין כל ערובה לכך, שאוסף האשפה אכן יתבע את הזיכרון, שתופס אובייקט ספציפי.
לכן, אין כל ערובה לכך, שמתודת
finalize תיקרא אי-פעם בכלל.

(למעשה, מ‑1.1 JDK ומעלה, ניתן להבטיח את ביצוע הסיום של אובייקטים באמצעות הפעלת runFinalizersOnExit(true) במקום כלשהו בתוכנית.)

השורה התחתונה היא, לא לשים במתודת finalize קוד כלשהו, האמור להתבצע, אלא אם כן אתה מפעיל את runFinalizersOnExit(true).

ככל הנראה, לא קיימת ב‑Java שום מקבילה להורס של ++C.

 

ביצוע סיום והורשה

 

שים לב ש‑The Java Tutorial מציין, שאם המחלקה שלך יורשת ממחלקת-על, שגם היא בעלת מתודת finalize, עליך להשתמש בתחביר הבא על מנת לקרוא לאותה מתודה לאחר שמתודת finalize ביצעה את תפקידה באופן סופי:

 

super.finalize();

 

לגבי בנייה, נהיה בדרך כלל מעוניינים לבנות מן השורש של עץ ההורשה אל הענפים.

לגבי ביצוע סיום, נהיה בדרך כלל מעוניינים להפוך את הסדר, מן הענפים חזרה אל השורש.

 

 05-01-04 / 20:01  נוצר ע"י רונית רייכמן  בתאריך 
 בנאים - הקודםהבא - שאלות סיכום 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 5