מילת המפתח "הסופית" בג'אווה

1. סקירה כללית

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

במדריך זה, נסתכל על מה סופי מילת מפתח פירושה עבור מחלקות, שיטות ומשתנים.

2. סופי שיעורים

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

שקול את המצב אם נוכל להרחיב את חוּט בכיתה, לעקוף כל אחת משיטותיה ולהחליף את כל חוּט מקרים עם המקרים הספציפיים שלנו חוּט תת מחלקה.

תוצאת הפעולות הסתיימה חוּט אז אובייקטים יהפכו לבלתי צפויים. ובהתחשב בכך שה חוּט בשיעור נעשה שימוש בכל מקום, זה לא מקובל. לכן ה חוּט הכיתה מסומנת כ- סופי.

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

שיעור גמר ציבורי חתול {משקל אינטימי פרטי; // גטר וקובע סטנדרטי}

ובואו ננסה להרחיב את זה:

המעמד הציבורי BlackCat מרחיב את החתול {}

נראה את שגיאת המהדר:

הסוג BlackCat אינו יכול לסווג את המחלקה הסופית Cat

ציין זאת ה סופי מילת מפתח בהצהרת כיתה לא אומרת שהאובייקטים של מחלקה זו אינם ניתנים לשינוי. אנחנו יכולים לשנות את השדות של חתול התנגד בחופשיות:

חתול חתול = חתול חדש (); cat.setWeight (1); assertEquals (1, cat.getWeight ()); 

אנחנו פשוט לא יכולים להאריך את זה.

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

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

אם הכיתה היא סופי, איננו יכולים להרחיב אותה כדי לעקוף את השיטה ולתקן את הבעיה. במילים אחרות, אנו מאבדים את הרחבה, אחד היתרונות של תכנות מונחה עצמים.

3. סופי שיטות

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

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

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

בואו ניצור a כֶּלֶב בכיתה ולעשות שלה נשמע() שיטה סופי:

ציבורי כלב {צליל בטל סופי ציבורי () {// ...}}

עכשיו בואו נאריך את כֶּלֶב בכיתה ולנסות לעקוף את שלה נשמע() שיטה:

מעמד ציבורי BlackDog מאריך את הכלב {צליל בטל ציבורי () {}}

נראה את שגיאת המהדר:

- עוקף את com.baeldung.finalkeyword.Dog.sound - לא ניתן לעקוף את השיטה הסופית משיטת הכלב () היא סופית ולא ניתן לבטלה

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

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

מה ההבדל בין הכנת כל השיטות בכיתה סופי וסימון הכיתה עצמה סופי? במקרה הראשון, אנו יכולים להרחיב את הכיתה ולהוסיף לה שיטות חדשות.

במקרה השני, איננו יכולים לעשות זאת.

4. סופי משתנים

משתנים המסומנים כ סופי לא ניתן להקצות מחדש. פעם אחת סופי משתנה מאותחל, לא ניתן לשנותו.

4.1. סופי משתנים פרימיטיביים

בואו נכריז על פרימיטיבי סופי מִשְׁתַנֶה אני, ואז הקצה לו 1.

ובואו ננסה להקצות לו ערך 2:

חלל ציבורי כאשרFinalVariableAssign_thenOnlyOnce () {final int i = 1; // ... אני = 2; }

המהדר אומר:

המשתנה המקומי האחרון אולי כבר הוקצה

4.2. סופי משתני הפניה

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

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

חתול חתול סופי = חתול חדש ();

אם ננסה להקצות אותו מחדש, נראה שגיאת מהדר:

לא ניתן להקצות את החתול המשתנה המקומי הסופי. זה חייב להיות ריק ולא עושה שימוש במשימה מורכבת

אבל אנחנו יכולים לשנות את המאפיינים של חתול למשל:

cat.setWeight (5); assertEquals (5, cat.getWeight ());

4.3. סופי שדות

סופי שדות יכולים להיות קבועים או שדות כתיבה פעם אחת. כדי להבחין ביניהם, עלינו לשאול שאלה - האם נכלול את השדה הזה אם היינו מסדרים את האובייקט? אם לא, אז זה לא חלק מהאובייקט, אלא קבוע.

שים לב שעל פי מוסכמות שמות, קבועי המחלקה צריכים להיות גדולים, עם רכיבים המופרדים בתווים תחתונים ("_"):

סופי סטטי int MAX_WIDTH = 999;

ציין זאת כל סופי יש לאתחל את השדה לפני השלמת הבנאי.

ל גמר סטטי שדות, פירוש הדבר שנוכל לאתחל אותם:

  • עם ההכרזה כפי שמוצג בדוגמה לעיל
  • בבלוק האתחול הסטטי

לדוגמה סופי שדות, פירוש הדבר שנוכל לאתחל אותם:

  • עם ההכרזה
  • בבלוק אתחול המופע
  • בקונסטרוקטור

אחרת, המהדר יתן לנו שגיאה.

4.4. סופי ויכוחים

ה סופי מילת מפתח היא גם חוקית לשים לפני טיעוני שיטה. א סופי לא ניתן לשנות טיעון בתוך שיטה:

שיטת הריק הציבורי WithFinalArguments (int int final) {x = 1; }

המטלה שלעיל גורמת לשגיאת המהדר:

לא ניתן להקצות את המשתנה המקומי הסופי x. זה חייב להיות ריק ולא עושה שימוש במשימה מורכבת

5. מסקנה

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

כמו תמיד, ניתן למצוא את הקוד השלם למאמר זה בפרויקט GitHub.