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

1. הקדמה

במדריך זה נשקול שיעורים אנונימיים בג'אווה.

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

2. הצהרת כיתות אנונימית

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

אנו עשויים להרחיב מחלקה קיימת או ליישם ממשק.

2.1. הרחב כיתה

כאשר אנו מייצרים מחלקה אנונימית ממחלקה קיימת, אנו משתמשים בתחביר הבא:

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

ספר חדש ("דפוסי עיצוב") {@ תיאור ציבורי מחרוזת ציבורית () {החזר "ספר GoF מפורסם."; }}

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

2.2. יישם ממשק

אנו עשויים לייצר שיעור אנונימי גם מממשק:

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

Runnable חדש () {@Override public void run () {...}}

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

אנו יכולים לעשות זאת באמצעות התחביר הסטנדרטי לביטויי Java:

פעולה ניתנת לריצה = ריצה חדשה () {@Override הפעלה בטלנית ציבורית () {...}};

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

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

רשימת פעולות = ArrayList חדש (); actions.add (חדש Runnable () {@Override public void run () {...}});

עלינו להשתמש בתחביר זה בזהירות רבה מכיוון שהוא עלול לסבול בקלות מקריאות הקוד, במיוחד בעת יישום ה- לָרוּץ() השיטה לוקחת הרבה מקום.

3. נכסי כיתות אנונימיים

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

3.1. בַּנַאִי

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

למעשה, היעדרותו של קונסטרוקטור אינה מהווה בעינינו שום בעיה מהסיבות הבאות:

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

3.2. חברים סטטיים

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

לדוגמה, פעולה זו לא תיכלל:

חדש Runnable () {סטטי סופי int x = 0; סטטי int y = 0; // שגיאת אוסף! @ עקוף הפעלה בטלנית ציבורית () {...}};

במקום זאת, נקבל את השגיאה הבאה:

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

3.3. היקף המשתנים

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

ספירת int = 1; פעולה ניתנת לריצה = חדשה ניתן להפעיל () {@Override run public void () {System.out.println ("ניתן להפעיל עם משתנים שנתפסו:" + ספירה); }}; 

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

שים לב שכדי להיות מסוגלים להשתמש במשתנים מקומיים, עליהם להיות סופיים באופן יעיל. מאז JDK 8, איננו נדרש להכריז על משתנים עם מילת המפתח סופי. עם זאת, המשתנים האלה חייבים להיות סופי. אחרת, אנו מקבלים שגיאת אוסף:

[שגיאה] משתנים מקומיים שמפנים אליהם ממעמד פנימי חייבים להיות סופיים או סופיים

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

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

4. מקרי שימוש אנונימיים בכיתה

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

4.1. היררכיית כיתות ותמצית

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

4.2. מבנה פרויקט מנקה יותר

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

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

ביישומים עם ממשק גרפי, מקרה השימוש הנפוץ ביותר של שיעורים אנונימיים הוא יצירת מאזינים לאירועים שונים. לדוגמא, בקטע הבא:

button.addActionListener (ActionListener חדש () {action public spided performed (ActionEvent e) {...}}

אנו יוצרים מופע של מחלקה אנונימית המיישמת ממשק ActionListener. שֶׁלָה פעולה בוצעה השיטה מופעלת כאשר משתמש לוחץ על הכפתור.

מאז Java 8, נראה כי ביטויים למבדה הם דרך מועדפת יותר.

5. תמונה כללית

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

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

6. מסקנה

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

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