שיעורים מקוננים בג'אווה

1. הקדמה

מדריך זה הוא מבוא מהיר ונקודתי לשיעורים מקוננים בשפת Java.

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

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

  • שיעורים מקוננים סטטיים
  • שיעורים מקוננים לא סטטיים
  • שיעורים מקומיים
  • שיעורים אנונימיים

בסעיפים הבאים נדון בפירוט על כל אחד מאלה.

2. כיתות מקוננות סטטיות

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

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

בואו נראה כיצד נוכל להכריז על מעמד מקונן סטטי:

מחלקה ציבורית סוגרת {intic private int x = 1; מחלקה סטטית ציבורית StaticNested {private void run () {// שיטת הטמעה}} @ Test public void test () {Enclosing.StaticNested nested = new Enclosing.StaticNested (); nested.run (); }}

3. כיתות מקוננות לא סטטיות

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

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

כך נוכל להכריז על מעמד פנימי:

כיתה ציבורית חיצונית {כיתה ציבורית פנימית {// ...}}

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

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

בואו נראה איך נוכל לעשות זאת:

חיצוני חיצוני = חיצוני חדש (); חיצוני.פנימי = חיצוני. חדש פנימי ();

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

3.1. שיעורים מקומיים

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

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

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

הנה דוגמה מהירה:

מחלקה ציבורית NewEnclosing {void run () {class Local {void run () {// method implementation}} Local local = new Local (); local.run (); } מבחן הריק הציבורי @ @ מבחן () {NewEnclosing newEnclosing = חדש NewEnclosing (); newEnclosing.run (); }}

3.2. שיעורים אנונימיים

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

בואו לרשום כמה נקודות שיש לזכור לגבי שיעורים אנונימיים:

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

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

מחלקה מופשטת SimpleAbstractClass {הפעלת ריק ריק (); }

בואו נראה כיצד נוכל להגדיר מחלקה אנונימית:

מחלקה ציבורית AnonymousInnerUnitTest {@Test public void whenRunAnonymousClass_thenCorrect () {SimpleAbstractClass simpleAbstractClass = new SimpleAbstractClass () {void run () {// שיטת הטמעה}}; simpleAbstractClass.run (); }}

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

4. הצללה

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

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

בואו נראה דוגמה מהירה:

מחלקה ציבורית NewOuter {int a = 1; סטטי int b = 2; מחלקה ציבורית InnerClass {int a = 3; סופי סטטי int b = 4; הפעלה בטלנית ציבורית () {System.out.println ("a =" + a); System.out.println ("b =" + b); System.out.println ("NewOuterTest.this.a =" + NewOuter.this.a); System.out.println ("NewOuterTest.b =" + NewOuter.b); System.out.println ("NewOuterTest.this.b =" + NewOuter.this.b); }} @ מבחן חלל ציבורי @) {NewOuter חיצוני = NewOuter חדש (); NewOuter.InnerClass פנימי = חיצוני. חדש InnerClass (); inner.run (); }}

5. סידור

כדי למנוע א java.io.NotSerializableException בעת ניסיון לסדר מחלקה מקוננת, עלינו:

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

6. מסקנה

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

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