שיעורים גנריים מקלים על שימוש חוזר. הפוך את הקוד שלך להרחבה ויעיל באמצעות מחלקות גנריות ב-Java.
Generics הוא קונספט תכנות המאפשר לך לציין את הסוג שאתה מתכוון לאחסן באוסף. סוג גנרי יכול להיות כל ערך לא פרימיטיבי. פרמטרי הסוג המסורתיים שאולי אתה מכיר הם מחרוזת ומספר שלם.
עם זאת, אתה יכול ליצור סוג גנרי ייחודי. יתר על כן, אתה יכול ליצור מחלקה גנרית ולהשתמש בה כדי ליצור אוספים שונים באמצעות גנריות.
יצירת סוג גנרי
טיפוס גנרי הוא בעצם אובייקט, נוצר באמצעות מחלקה או ממשק. אז, עבור מאמר זה, הסוג הגנרי יהיה לקוח. באמצעות יישום לדוגמה ברמת הארגון, הלקוח מייצג ישות במערכת מסד נתונים. מערכת מסד נתונים זו משרתת חברת רהיטים שיש לה שלושה מיקומים פיזיים בשלוש ערים שונות.
publicabstractclassCustomer{
private String name;
publicCustomer(String name){
this.name = name;
}
public String getName(){
return name;
}
}
אתה תבחין ב תַקצִיר מילת מפתח ב- צרכן הצהרת הכיתה לעיל. זה אומר שאתה לא יכול ליצור סוג ישיר או אובייקט מה- צרכן סוּג.
בהתחשב בכך שלכל מיקום חנות פיזית תהיה רשימה ייחודית של לקוחות, האפליקציה תצטרך לכלול שלוש תת-מחלקות לקוחות אותם תטמיע באמצעות תפיסת תכנות הירושה.
שלושת תת המחלקות הללו יהיו הסוגים המוצקים לגנרי צרכן סוּג. הראשון צרכן תת-מחלקה תכיל את הקוד הבא:
publicclassCity1CustomerextendsCustomer{
publicCity1Customer(String name){
super(name);
}
}
יצירת מחלקה גנרית
כדי להשתמש בסוג גנרי, תצטרך להיות מחלקה או שיטה גנרית שמקבלת את הסוג הזה כפרמטר. כדי ליצור מחלקה גנרית, אתה פשוט צריך להכניס את פרמטר הסוג להצהרת המחלקה.
publicclassPromotion<T> {}
הקוד למעלה מציין כי קידום הכיתה היא גנרית. זה אומר שה קידום class משתמשת בסוגים כדי ליצור את האובייקטים שלה. כעת הצהרת הכיתה יכולה לקחת אוסף של אובייקטים שהם מחרוזות, מספרים שלמים, לקוחות וכן הלאה. עם זאת, חברת הרהיטים רוצה רק את קידום מחלקה כדי ליצור אובייקטים באמצעות ה צרכן סוגים.
publicclassPromotion<TextendsCustomer> {}
הקוד המעודכן למעלה מבטיח שה- קידום הכיתה לוקחת רק את צרכן סוגים, זה אומר כל תת המחלקות של צרכן מעמד.
בהתחשב בעובדה שיש שלוש חנויות, החברה רוצה ליצור מבצע אחד עצמאי לכל חנות. הנתונים הנדרשים למבצעים אלו דומים. לכל מבצע יהיה שם ואוסף לקוחות שזכו באותו מבצע.
ישנן מספר דרכים לגשת לבעיה זו. אתה יכול ליצור א קידום כיתת אב ויש להם שלוש מחלקות משנה לכל מיקום חנות. אבל מאז כל אחד קידום בעל מבנה דומה, בסופו של דבר תכתוב קוד כפול, וזה לא יעיל (במיוחד מכיוון שאתה כבר עובד עם צרכן תת מחלקות).
לכן, א קידום מחלקה גנרית היא אחד הפתרונות היעילים יותר לבעיה זו.
import java.util.ArrayList;
publicclassPromotion<TextendsCustomer> {
private String promoName;
private ArrayListwinners = new ArrayList<>(); publicPromotion(String promoName){
this.promoName = promoName;
}public String getPromoName(){
return promoName;
}publicvoidaddCustomer(T customer){
if (winners.contains(customer)) {
System.out.println( customer.getName() + " is already a winner of this prize.");
} else {
winners.add(customer);
System.out.println( customer.getName() + " is a winner in the " + this.promoName);
}
}
publicintnumWinners(){
returnthis.winners.size();
}
}
ה קידום למחלקה הגנרית יש משתנה יחיד (promoName). שיעור Java זה מקבל אוסף של לקוחות שזכו במבצע (זוכים) ומאחסן אותם ב- מבנה הנתונים של ArrayList. כדי להוסיף לקוח חדש לאוסף מבצעים ספציפי, תצטרך להשתמש ב- addCustomer() שיטה. אם בשלב כלשהו אתה רוצה לדעת את מספר הלקוחות שנמצאים באוסף, אתה יכול להפעיל את numWinners() שיטה.
יצירת אוספים באמצעות מחלקה גנרית
לפני שתוכל להתחיל ליצור אוספים, תצטרך ליצור לקוחות.
publicclassMain{
publicstaticvoidmain(String[] args){
City1Customer john = new City1Customer("John Brown");
City1Customer kelly = new City1Customer("Kelly James");
City2Customer jane = new City2Customer("Jane Doe");
City3Customer jess = new City3Customer("Jess Smith");
}
}
ה רָאשִׁי המחלקה למעלה יוצרת ארבעה אובייקטים של לקוחות, כל אחד שייך לאחד משלושת מיקומי החנות. כדי להתחיל ליצור אוספים תצטרכו ליצור תחילה אובייקטי קידום (אחד לכל מיקום חנות).
Promotion city1promo = new Promotion("City1 Promo");
Promotion city2promo = new Promotion("City2 Promo");
Promotion city3promo = new Promotion("City3 Promo");
הכנסת שלוש שורות הקוד למעלה לתוך רָאשִׁי הכיתה תיצור למעשה שלושה קידומי מכירות ספציפיים לסוג (או מיקום ספציפי). אז, רק לקוחות מהחנות במיקום העיר הראשון (City1 Customer) יכול להיות מנצח בקידום של אותה עיר (city1promo).
city1promo.addCustomer(john);
city1promo.addCustomer(kelly);
לכן, הוספת הקוד לעיל ל- רָאשִׁי class תפיק את התוצאה הבאה במסוף:
עם זאת, אם תנסה להוסיף לקוח שלישי לרשימת הזוכים בקידום בעיר הראשונה, ה-IDE שלך יפיק שגיאת קומפילציה.
זה בגלל שאף אחד מהם ג'יין ולא ג'ס הוא לקוח של החנות בעיר הראשונה. יצירת סוגים ומחלקות כלליים היא שימושית, מכיוון שהיא מונעת מהשגיאות הפשוטות הללו לא להיתפס ולהשחית את מסד הנתונים של המערכת. באפליקציה קטנה, זה יכול להיות קל לזהות שגיאות כמו זו, אבל במערכת ברמת הארגון, שגיאות כמו זו עלולות לא להיתפס.
city2promo.addCustomer(jane);
החלפת שורת הקוד השגויה בזו שלמעלה תדפיס את הפלט הבא למסוף:
יתרונות השימוש בסוגים גנריים
מהיישום לדוגמה במאמר זה, אתה יכול לראות שהיתרון העיקרי של שימוש בסוגים גנריים הוא בדיקת סוגים בזמן הידור. ללא בדיקת סוג, הוספת ג'יין לכל אחת משלוש רשימות המבצעים לא תיצור טעות בזמן ביצוע, שכן ג'יין היא אכן לקוחה של חברת הרהיטים.
Generics גם מאפשרת מספר יתרונות אחרים, כולל שימוש חוזר בקוד ומדרגיות. ככל שהחברה מתרחבת לערים חדשות, תוכל ליצור בקלות סוגי אובייקטי קידום חדשים, תוך הסתמכות רבה על הקוד הקיים. סוגים גנריים גם מאפשרים לך ליצור קוד יעיל, שהוא בעדיפות עליונה בתהליך פיתוח התוכנה.