מילת המפתח final
היא
modifier שניתן לצרף לכל הגדרה בג'אווה, הגדרה של משתנים ושדות, של
ארגומנטים של שירותים, של שירותים, ואפילו של מחלקות שלמות.
המשמעות של final
היא תמיד זהה: לישות
המוגדרת תתבצע השמה אחת לכל היותר. מכיון שאפשר לבצע לישות כזו השמה אחת
בלבד, ההשמה הזו היא גם ההשמה הסופית, ומכאן המילה final
.
כעת נדון במשמעות של final
בהגדרה של
משתנים, שדות, וארגומנטים. המשמעות של final
בהגדרה של שירותים ומחלקות משפיעה על נושא שלא נגענו בו כלל (ירושה), ולכן
נסביר את המשמעות הזו בהמשך.
לגבי שדות משתנים (וארגומנטים של שירותים, שכזכור גם הם משתנים מקומיים של השירות) המשמעות פשוטה מאוד: השמה אחת לכל היותר. ההשמה הזו יכולה להתבצע במשפט שגם מגדיר את המשתנה או השדה. זו תבנית תכנות נפוצה מאוד. אפשר גם לבצע את ההשמה היחידה המותרת גם מאוחר יותר, אבל זה נדיר למדי.
כאשר מפעילים שירות (קוראים לו), מתבצעת השמה לארגומנטים של
השירות. לפיכך, אם ארגומנט מוגדר להיות final
,
אי אפשר לבצע השמה לתוכו בכלל בגוף השירות; ההשמה היחידה המותרת כבר
התבצעה בנקודת ההפעלה של השירות.
מכיון שמילת המפתח final
רק אוסרת (על
צורת שימוש במשתנים שהיתה חוקית בלעדיה אבל אינה חוקית בהימצאה),
היא אינה מוסיפה דבר ליכולות הביצועיות של השפה. אם כן, למה הכלילו אותה
בשפה בכלל? יש שתי סיבות לשימוש ב-final
. סיבה
אחת היא שהבדיקה של הקומפיילר שאכן מתבצעת השמה יחידה לכל היותר עשויה
לסייע לנו למצוא פגמים בתוכנית. סיבה שניה היא שהידיעה שהתוכן של משתנה או
שדה לא ישתנה יותר עשויה לסייע לקומפיילר ולסביבת זמן הריצה לבצע את
התוכנית בצורה יעילה יותר.
final boolean divisible_by_three;
for (int i=5; i<=7; i++) {
if (i % 3 == 0) {
divisible_by_three=true;
System.out.println(divisible_by_three);
}
}