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

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

Java 8 הביא לשולחן כמה תכונות חדשות לגמרי, כולל ביטויים למבדה, ממשקים פונקציונליים, הפניות לשיטות, זרמים, אופציונלי ו- סטָטִי ו בְּרִירַת מֶחדָל שיטות בממשקים.

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

במאמר זה נדון לעומק איך להישתמש סטָטִי ו בְּרִירַת מֶחדָל שיטות בממשקים ולעבור כמה מקרי שימוש בהם הם יכולים להיות שימושיים.

2. מדוע יש צורך בשיטות ברירת מחדל בממשקים

כמו שיטות ממשק רגילות, שיטות ברירת המחדל הן ציבורית באופן מרומז אין צורך לציין את פּוּמְבֵּי מַתקֵן.

בניגוד לשיטות ממשק רגילות, הן כן הצהיר עם בְּרִירַת מֶחדָל מילת מפתח בתחילת חתימת השיטה, והם לספק יישום.

בואו נראה דוגמה פשוטה:

ממשק ציבורי MyInterface {// שיטות ממשק רגילות ברירת מחדל void defaultMethod () {// יישום שיטת ברירת מחדל}}

הסיבה למה בְּרִירַת מֶחדָל שיטות כללו במהדורת Java 8 די ברור.

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

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

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

3. שיטות ממשק ברירת מחדל בפעולה

כדי להבין טוב יותר את הפונקציונליות של בְּרִירַת מֶחדָל שיטות ממשק, בואו ליצור דוגמה פשוטה.

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

ממשק ציבורי רכב {String getBrand (); מחרוזת speedUp (); מחרוזת slowDown (); ברירת מחדל מחרוזת turnAlarmOn () {return "הפעלת אזעקת הרכב."; } ברירת מחדל String turnAlarmOff () {return "כיבוי אזעקת הרכב."; }}

ובואו נכתוב את כיתת היישום:

יישומי רכב ברמה הציבורית {מותג פרטי מחרוזת; // בונים / זוכים @ ציבורי מחרוזת getBrand () {מותג להחזיר; } @ Override public String speedUp () {return "המכונית מאיצה."; } @ Override public מחרוזת slowDown () {return "המכונית מאטה."; }} 

לבסוף, בואו נגדיר טיפוסית רָאשִׁי class, שיוצר מופע של אוטו וקוראת לשיטותיה:

ריק סטטי ציבורי ראשי (String [] args) {רכב רכב = רכב חדש ("BMW"); System.out.println (car.getBrand ()); System.out.println (car.speedUp ()); System.out.println (car.slowDown ()); System.out.println (car.turnAlarmOn ()); System.out.println (car.turnAlarmOff ()); }

שימו לב כיצד ה בְּרִירַת מֶחדָל שיטות turnAlarmOn () ו turnAlarmOff () משלנו רכב ממשק הם זמין באופן אוטומטי ב אוטו מעמד.

יתר על כן, אם בשלב מסוים נחליט להוסיף עוד בְּרִירַת מֶחדָל שיטות ל רכב ממשק, היישום עדיין ימשיך לעבוד, ולא נצטרך לאלץ את הכיתה לספק יישומים לשיטות החדשות.

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

בנוסף, ניתן להשתמש בהם לספק פונקציונליות נוספת סביב שיטה מופשטת קיימת:

ממשק ציבורי רכב {// שיטות ממשק נוספות כפול getSpeed ​​(); ברירת מחדל כפולה getSpeedInKMH (מהירות כפולה) {// המרה}}

4. כללי ירושה בממשק מרובים

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

כדי להבין טוב יותר את התרחיש הזה, בואו נגדיר חדש אזעקה ממשק ומשקף את אוטו מעמד:

ממשק ציבורי אזעקה {ברירת מחדל turnAlarmOn () {חזרה "הפעלת האזעקה."; } ברירת מחדל מחרוזת turnAlarmOff () {חזרה "כיבוי האזעקה."; }}

עם ממשק חדש זה המגדיר סט של בְּרִירַת מֶחדָל שיטות, אוטו הכיתה תיישם את שניהם רכב ו אזעקה:

יישומי רכב ברמה ציבורית, רכב, אזעקה {// ...}

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

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

@Override Public String turnAlarmOn () {// יישום מותאם אישית} @Override Public String turnAlarmOff () {// יישום מותאם אישית}

אנחנו יכולים גם שהכיתה שלנו תשתמש ב בְּרִירַת מֶחדָל שיטות של אחד הממשקים.

בואו נראה דוגמה המשתמשת ב- בְּרִירַת מֶחדָל שיטות מה- רכב מִמְשָׁק:

@Override מחרוזת ציבורית turnAlarmOn () {return Vehicle.super.turnAlarmOn (); } @Override ציבורי מחרוזת turnAlarmOff () {return Vehicle.super.turnAlarmOff (); } 

באופן דומה, נוכל להשתמש בכיתה ב- בְּרִירַת מֶחדָל שיטות המוגדרות בתוך אזעקה מִמְשָׁק:

@Override ציבורי מחרוזת turnAlarmOn () {להחזיר Alarm.super.turnAlarmOn (); } @Override ציבורי מחרוזת turnAlarmOff () {להחזיר Alarm.super.turnAlarmOff (); } 

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

@Override מחרוזת ציבורית turnAlarmOn () {return Vehicle.super.turnAlarmOn () + "" + Alarm.super.turnAlarmOn (); } @Override ציבורי מחרוזת turnAlarmOff () {return Vehicle.super.turnAlarmOff () + "" + Alarm.super.turnAlarmOff (); } 

5. שיטות ממשק סטטיות

מלבד היכולת להכריז בְּרִירַת מֶחדָל שיטות בממשקים, Java 8 מאפשר לנו להגדיר וליישם סטָטִי שיטות בממשקים.

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

כדי להבין איך סטָטִי השיטות עובדות בממשקים, בואו לשקול מחדש את רכב ממשק ולהוסיף אליו א סטָטִי שיטת השירות:

ממשק ציבורי רכב {// שיטות ממשק רגילות / ברירת מחדל סטטי int getHorsePower (int סל"ד, int מומנט) {return (סל"ד * מומנט) / 5252; }} 

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

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

Vehicle.getHorsePower (2500, 480)); 

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

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

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

6. מסקנה

במאמר זה בחנו לעומק את השימוש ב- סטָטִי ו בְּרִירַת מֶחדָל שיטות ממשק בג'אווה 8. במבט ראשון, תכונה זו עשויה להיראות מעט מרושלת, במיוחד מנקודת מבט purist מונחה עצמים. באופן אידיאלי, ממשקים לא צריכים להכיל התנהגות ויש להשתמש בהם רק להגדרת ה- API הציבורי מסוג מסוים.

כשמדובר בשמירה על תאימות לאחור עם הקוד הקיים, עם זאת, סטָטִי ו בְּרִירַת מֶחדָל שיטות הן פשרה טובה.

וכרגיל, כל דגימות הקוד המוצגות במאמר זה זמינות ב- GitHub.


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