כיתות וממשקים אטומים ב- Java 15

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

שחרורו של Java SE 15 מציג שיעורים אטומים (JEP 360) כתכונת תצוגה מקדימה.

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

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

2. מוטיבציה

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

2.1. אפשרויות דוגמנות

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

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

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

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

2.2. הגישה החבילה-פרטית

בגרסאות קודמות ג'אווה סיפקה אפשרויות מוגבלות בתחום בקרת הירושה.

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

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

רכב בכיתה ציבורית {מחלקה סטטית מופשטת רכב {גמר פרטי מחרוזת הרשמה מספר רכב ציבורי (String registrationNumber) {this.registrationNumber = registrationNumber; } מחרוזת ציבורית getRegistrationNumber () {return registrationNumber; }} מחלקה סופית סטטית ציבורית רכב מרחיב את הרכב {פרט סופי פרטי intOFSeats; רכב ציבורי (int numberOfSeats, String registrationNumber) {super (registrationNumber); this.numberOfSeats = numberOfSeats; } public int getNumberOfSeats () {return numberOfSeats; }} מחלקה סופית סטטית ציבורית משאית מרחיבה את הרכב {private final int loadCapacity; משאית ציבורית (int loadCapacity, String registrationNumber) {super (registrationNumber); this.loadCapacity = loadCapacity; } public int getLoadCapacity () {return loadCapacity; }}}

2.3. Superclass נגיש, לא ניתן להרחבה

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

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

3. יצירה

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

3.1. ממשקים אטומים

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

ממשק אטום ציבורי אישורי שירות לרכב, משאית {int getMaxServiceIntervalInMonths (); ברירת מחדל int getMaxDistanceBetweenServicesInKilometers () {להחזיר 100000; }}

3.2. שיעורים סגורים

בדומה לממשקים, אנו יכולים לאטום שיעורים על ידי יישום אותם אָטוּם מַתקֵן. ה אישורים יש להגדיר סעיף לאחר כל מרחיב אוֹ מכשירים סעיפים:

תקציר ציבורי אטום בכיתה היתרי רכב רכב, משאית {מוגן סופית רישום מחרוזת מספר; רכב ציבורי (String registrationNumber) {this.registrationNumber = registrationNumber; } מחרוזת ציבורית getRegistrationNumber () {return registrationNumber; }}

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

כיתת גמר ציבורית משאית מרחיבה שירות כלי רכב {private load int loadCapacity; משאית ציבורית (int loadCapacity, String registrationNumber) {super (registrationNumber); this.loadCapacity = loadCapacity; } public int getLoadCapacity () {return loadCapacity; } @Override public int getMaxServiceIntervalInMonths () {חזרה 18; }}

ניתן להכריז גם על תת משנה מותרת אָטוּם. עם זאת, אם נכריז על כך לא אטום, ואז הוא פתוח להארכה:

מעמד ציבורי שאינו אטום מכונית מאריכה שירות כלי רכב {פרטי מספר סופי פרטיOfSeats; מכונית ציבורית (int numberOfSeats, String registrationNumber) {super (registrationNumber); this.numberOfSeats = numberOfSeats; } public int getNumberOfSeats () {return numberOfSeats; } @Override public int getMaxServiceIntervalInMonths () {חזרה 12; }}

3.4. אילוצים

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

  1. כל מחלקות המשנה המותרות חייבות להשתייך לאותו מודול של הכיתה האטומה.
  2. כל תת-קבוצה מותרת חייבת להרחיב במפורש את המעמד האטום.
  3. על כל תת-מחלקה מותרת להגדיר שינוי: סופי, אָטוּם, או לא אטום.

4. שימוש

4.1. הדרך המסורתית

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

הדרך המסורתית לחשוב על תת-מחלקה היא שימוש בערכה של אחרת הצהרות ו מופע של צ'קים:

אם (רכב רכב לרכב) {רכב (להחזיר (רכב)) .getNumberOfSeats (); } אחר אם (רכב רכב של משאית) {רכב (חזרה (משאית)) .getLoadCapacity (); } אחר {זרוק RuntimeException חדש ("מופע לא ידוע של רכב"); }

4.2. התאמת תבנית

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

אם (מופע רכב של מכונית רכב) {return car.getNumberOfSeats (); } אחר אם (מופע רכב של משאית משאית) {return truck.getLoadCapacity (); } אחר {זרוק RuntimeException חדש ("מופע לא ידוע של רכב"); }

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

בגירסאות עתידיות של Java, קוד הלקוח יוכל להשתמש ב- החלף הצהרה במקום if-else (JEP 375).

על ידי שימוש בדפוסי בדיקת סוג, המהדר יוכל לבדוק כי כל תת-מחלקה מותרת מכוסה. לפיכך, לא יהיה צורך יותר ב- בְּרִירַת מֶחדָל סעיף / מקרה.

4. תאימות

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

4.1. רשומות

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

ממשק אטום לציבור אישורי רכב רכב, משאית {מחרוזת getRegistrationNumber (); } מכונית רשומה ציבורית (int numberOfSeats, String registrationNumber) מיישמת את הרכב {@Override Public String getRegistrationNumber () {return registrationNumber; } public int getNumberOfSeats () {return numberOfSeats; }} משאית רשומה ציבורית (int loadCapacity, String registrationNumber) מיישמת את הרכב {@Override public String getRegistrationNumber () {return registrationNumber; } public int getLoadCapacity () {return loadCapacity; }}

4.2. הִשׁתַקְפוּת

מחלקות אטומות נתמכות גם על ידי ממשק ה- API של ההשתקפות, שבו נוספו שתי שיטות ציבוריות ל- java.lang.Class:

  • ה isSealed השיטה מחזירה נָכוֹן אם המחלקה או הממשק הנתון אטומים.
  • שיטה מותר תחתונים מחזירה מערך של אובייקטים המייצגים את כל מחלקות המשנה המותרות.

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

Assertions.assertThat (truck.getClass (). IsSealed ()). IsEqualTo (false); Assertions.assertThat (truck.getClass (). GetSuperclass (). IsSealed ()). IsEqualTo (true); Assertions.assertThat (truck.getClass (). GetSuperclass (). AllowedSubclasses ()) .contains (ClassDesc.of (truck.getClass (). GetCanonicalName ()));

5. מסקנה

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

בדוגמאות סקרנו יצירת ממשק אטום ומחלקה אטומה, השימוש במחלקה האטומה (עם וללא התאמת תבנית) ותאימות מחלקות אטומות לרשומות ולממשק ה- Reflection.

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


$config[zx-auto] not found$config[zx-overlay] not found