בנאי (מדעי המחשב)
בתכנות מונחה-עצמים, בנאי (באנגלית: constructor, לעיתים נכתב בקיצור: ctor) הוא פיסת תוכנה (דומה לשגרה) המאתחלת אובייקט, ונקראת באופן אוטומטי מיד לאחר שהאובייקט נוצר.
בנאי דומה למתודות רגילות, אך תפקידו שונה באופן מהותי. בתחילת הריצה של הבנאי האובייקט אותו הוא צריך לבנות עדיין איננו מוגדר עד תומו[1]. תפקידו של הבנאי הוא למעשה לדאוג לכך שהאובייקט יהיה בנוי היטב (כלומר, שהאינווריאנט של האובייקט יתקיים), למשל עבור אובייקט המגדיר תאריך, לדאוג שהשדה של היום בחודש יכיל ערך חוקי ביחס לחודש אליו האובייקט מאותחל, ולא יכיל "זבל". זאת בניגוד למתודה רגילה המניחה שהאובייקט עליו היא פועלת בנוי היטב, וצריכה רק לדאוג לשמור אותו במצב זה.
הבנאי נקרא רק לאחר שהזיכרון עבור האובייקט כבר הוקצה; בשפות תכנות המאפשרות למתכנת לשלוט בהקצאה, זו תתבצע בעזרת פונקציה נפרדת. על פי רוב מוגדר בשפת התכנות בנאי "ברירת מחדל" למחלקה, ולעיתים די בבנאי זה - למשל כאשר ניתן להגדיר ערכי התחלה לשדות באופן ישיר, או כאשר אין צורך בפרמטרים, או כאשר השפה מאפשרת אתחול ישיר של השדות על ידי הצד שיוצר את האובייקט. ישנן שפות תכנות בהן ניתן לכתוב מספר בנאים שונים לאותה מחלקה. בנאים יכולים לקבל פרמטרים, אך בשפות תכנות רבות הבנאי שונה ממתודות גם בכך שאין לו ערך החזרה, כך שלא ניתן לסמן כישלון דרך ערך החזרה. בשפות תכנות התומכות בניהול חריגות ניתן לסמן כישלון של הבניה בעזרת חריגה. בשפות בהן יש הורס (destructor) שתפקידו לשחרר משאבים המוחזקים על ידי המחלקה, ושנקרא אוטומטית כאשר אובייקט נהרס, הוא לא ייקרא אם הבנאי סימן כישלון.
שמו של הבנאי הוא לרוב כשם המחלקה עבורה הוא מוגדר, אך ישנן שפות תכנות (למשל שפת D) שבהן אין לבנאי שם, או שהבנאי נקרא this, על מנת שלא לחזור על שם המחלקה במקומות שונים שלא לצורך.
בתכנות פונקציונלי, בנאים הם פונקציות היוצרות באופן חד-חד-ערכי ערך מטיפוס נתונים מורכב, ולהן קיים גם "הורס" (על פי רוב, בצורה של תבנית) המאפשר לקבל בחזרה את הפרמטרים שהועברו להן. בנאים כאלה אינם כוללים קוד המוגדר על ידי המשתמש. הגישה הזו מקלה על הוכחת נכונות של תוכניות, בעזרת הוכחה באינדוקציה.
ב-Java הבנאי מהווה חלק מהמנגנון של גוש אתחול.
דוגמאות ל-Constructor
עריכה public class Example
{
//הגדרת הבנאי
public Example()
{
this(1);
}
//העמסת הבנאי
public Example(int input)
{
data = input;
}
//declaration of instance variable(s).
private int data;
}
//code somewhere else
//instantiating an object with the above constructor
Example e = new Example(42);
class Example {
public:
// בנאי שאינו מקבל פרמטרים
Example()
{
data = 0;
}
// העמסה של בנאי
Example(int data)
{
this->data = data;
}
private:
int data;
};
// Code somewhere else
// Instance an object on the stack with the above constructor
Example a(4);
// Instance one on the heap
Example *b = new Example(4);
ראו גם
עריכההערות שוליים
עריכה- ^ למשל, בשפת ++C עשויים להיות לאובייקט שדות שערכיהם כלל אינם מוגדרים; בשפת ג'אווה, ערכי השדות מוגדרים על ידי השפה, אך לא בהכרח בעלי ערך משמעותי עבור המחלקה.