ב-Java ממשקים חיוניים, כשמדובר בקביעת חוזי כיתות והבטחת עקביות קוד בתחום תכנות Java. הוא משמש כשרטוט של מחלקה על ידי תיאור של מספר שיטות שהמחלקה המיישמת נדרשת ליישם. את ההפשטה, המודולריות ותחזוקה של הקוד שלהם ניתן להשיג כולם על ידי מפתחים על ידי שימוש בממשקים. ה סוגי ממשקים שונים ב-Java יידונו בחלק זה.
ממשקי סמן
ממשקי סמן, הנקראים לעתים קרובות ממשקי תג, הם ממשקים ללא שיטות מוצהרות. במילים פשוטות, הם משמשים כסמנים, מאותתים שלמחלקה המיישמת את ממשק הסמן יש תכונות או איכויות מסוימות. סביבת זמן הריצה של Java וכלים אחרים עושים שימוש בממשקי API אלה כדי לספק פונקציונליות נוספת או נתונים. ניתן לסידרה, לשכפול ומרוחק הם כמה מקרים של ממשקי סמנים ב-Java.
ממשקים פונקציונליים
כחלק מהשיפורים לביטויי למבדה ולתכנות פונקציונלי, נוספו ממשקים פונקציונליים ל-Java 8. ממשק שיש לו בדיוק שיטה אבסטרקטית אחת הוא פונקציונלי. בנוסף, שיטות ברירת מחדל ושיטות סטטיות אפשריות. יכולות תכנות פונקציונליות רבות של Java, כמו ביטויי למבדה והפניות לשיטות, עושות שימוש בממשקים פונקציונליים. Predicate, Consumer, Function וספק הם רק כמה מהממשקים הפונקציונליים המובנים המוצעים על ידי חבילת java.util.function.
ממשקים של שיטה מופשטת אחת (SAM).
לפני Java 8, היו סוגים מסוימים של ממשקים פונקציונליים שנקראו ממשקי SAM. לממשקים אלה יכולים להיות כל מספר של שיטות ברירת מחדל או סטטיות, אך רק שיטה מופשטת אחת. Runnable, Comparator ו-MouseListener הם כמה ממשקי API לפני Java 8 המכילים דוגמאות ממשק SAM. עם הצגת ממשקים פונקציונליים ב-Java 8, ניתן להשתמש בממשקי SAM עם ביטויי למבדה ולהתייחס אליהם כממשקים פונקציונליים.
מודם לעומת ראוטר
ממשקים רגילים
הסוג הנפוץ ביותר של ממשקים בג'אווה הוא ממשקים רגילים. יש להם מתודה מופשטת אחת או יותר שהמחלקות שמיישמות את הממשק חייבות ליישם. החל מ-Java 8, ממשקים רגילים יכולים להכיל בנוסף שיטות ברירת מחדל וסטטיות. ממשקים רגילים משמשים מפתחים כדי לציין את הכללים או הדרישות ששיעורים חייבים לעקוב אחריהם. רשימה, סט ומפה, שכולם נמצאים בחבילת java.util, הם דוגמאות לממשקי Java טיפוסיים.
ממשקי ירושה מרובים
פלינדרום ב-Java
Java מתירה למחלקות ליישם ממשקים מרובים אך אינה תומכת בהורשה של מחלקות מרובות. ממשקים המיושמים על ידי מחלקה כדי להגדיר בו זמנית מספר חוזים או התנהגות בירושה ידועים כממשקי ירושה מרובים. מחלקה יכולה להציע את הפונקציונליות המתוארת על ידי כל ממשק על ידי הטמעת מספר ממשקים. בעזרת פונקציונליות זו, מפתחים יכולים לעשות שימוש חוזר בקוד ולהגביר את יכולת ההסתגלות של הרעיונות שלהם.
להלן דוגמאות לקוד עבור כל סוג של ממשק ב-Java יחד עם הפלט המתאים להם:
ממשקי סמן
MarkerInterfaceExample.java
import java.io.Serializable; // Marker Interface interface MyMarkerInterface extends Serializable { } public class MarkerInterfaceExample { public static void main(String[] args) { MyMarkerInterface obj = new MyMarkerInterface() { }; System.out.println(obj instanceof Serializable); // true } }
תְפוּקָה:
true
ממשקים פונקציונליים
FunctionalInterfaceExample.java
import java.util.function.Predicate; public class FunctionalInterfaceExample { public static void main(String[] args) { Predicate isLengthGreaterThan5 = str -> str.length() > 5; System.out.println(isLengthGreaterThan5.test('Hello')); // false System.out.println(isLengthGreaterThan5.test('OpenAI')); // true } }
תְפוּקָה:
false true
ממשקים של שיטה מופשטת אחת (SAM):
SAMInterfaceExample.java
interface MySAMInterface { void performAction(); } public class SAMInterfaceExample { public static void main(String[] args) { MySAMInterface obj = () -> System.out.println('Performing action'); obj.performAction(); // Performing action } }
תְפוּקָה:
לעשות ב-java
Performing action
ממשקים רגילים
NormalInterfaceExample.java
import java.util.List; import java.util.ArrayList; interface MyInterface { void printMessage(); } class MyClass implements MyInterface { @Override public void printMessage() { System.out.println('Hello, World!'); } } public class NormalInterfaceExample { public static void main(String[] args) { MyInterface obj = new MyClass(); obj.printMessage(); // Hello, World! } }
תְפוּקָה:
פתיחת רוכס בלינוקס
Hello, World!
ממשקי ירושה מרובים:
MultipleInheritanceInterfaceExample.java
interface Interface1 { void method1(); } interface Interface2 { void method2(); } class MyClass implements Interface1, Interface2 { @Override public void method1() { System.out.println('Method 1'); } @Override public void method2() { System.out.println('Method 2'); } } public class MultipleInheritanceInterfaceExample { public static void main(String[] args) { MyClass obj = new MyClass(); obj.method1(); // Method 1 obj.method2(); // Method 2 } }
תְפוּקָה:
Method 1 Method 2
דוגמאות אלו מדגימות את השימוש וההתנהגות של סוגים שונים של ממשקים ב-Java. אתה יכול להפעיל כל קטע קוד בנפרד כדי לראות את הפלט המתאים.
לסיכום, ממשקי Java מציעים שיטה חזקה לציון חוזים והשגת מודולריות קוד. ממשקים חיוניים לפיתוח Java, בין אם הם ממשקי סמן המציינים תכונות ספציפיות, ממשקים פונקציונליים המאפשרים תכנות פונקציונלי, ממשקים רגילים המגדירים חוזים, או ממשקי ירושה מרובים המשלבים מספר חוזים. מפתחי Java מצוידים טוב יותר לבנות קוד ברור וניתן להרחבה כאשר הם מודעים לסוגי הממשק השונים ולפונקציות שלהם.