בלוקים סטטיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 17 מתוך 87.
לפעמים צריך לאתחל משתנים סטטיים באמצעות לוגיקה מורכבת יותר מהשמה פשוטה. בלוק סטטי (שנקרא גם מאתחל סטטי) מופעל פעם אחת כשהמחלקה נטענת לראשונה, לפני שנוצרים אובייקטים כלשהם או נקראות מתודות סטטיות.
public class DatabaseConfig {
private static String connectionString;
private static int maxConnections;
static {
// לוגיקת אתחול מורכבת
connectionString = "jdbc:mysql://localhost:3306/mydb";
maxConnections = 10;
System.out.println("Database configuration loaded");
}
}הבלוק הסטטי מתבצע אוטומטית כשהמחלקה נטענת לזיכרון. הדבר קורה פעם אחת בלבד, בלי קשר למספר האובייקטים שיוצרים. הוא מתאים במיוחד לאתחול שדורש כמה פקודות, חישובים או לוגיקה מותנית.
אפשר להגדיר כמה בלוקים סטטיים במחלקה, והם מתבצעים לפי סדר הופעתם:
public class AppSettings {
private static int[] values;
static {
values = new int[5];
}
static {
for (int i = 0; i < values.length; i++) {
values[i] = i * 10;
}
}
}בלוקים סטטיים משמשים בדרך כלל לאתחול מערכים סטטיים או אוספים, להגדרת ערכי תצורה הדורשים חישוב ולביצוע משימות הגדרה חד־פעמיות ברמת המחלקה.
אתגר
קלנבנה מערכת GameConfig שמשתמשת בבלוקים סטטיים כדי לאתחל הגדרות משחק כשהמחלקה נטענת לראשונה. זה מתאים במיוחד להגדרות שצריך לחשב או להגדיר פעם אחת לפני יצירת אובייקטים כלשהם של המשחק.
תיצרו שני קבצים כדי לארגן את הקוד שלכם:
GameConfig.java: צרו מחלקת הגדרות שמאתחלת את ההגדרות שלה באמצעות בלוקים סטטיים:- מערך סטטי פרטי
levelThresholds(int[]) ששומר את הניקוד הנדרש כדי להגיע לכל שלב - משתנה סטטי פרטי
maxLevel(int) ששומר את המספר הכולל של השלבים - משתנה סטטי פרטי
configLoaded(boolean) למעקב אחר ביצוע האתחול - השתמשו בבלוק סטטי כדי לאתחל את
maxLevelל-5 ולהדפיס את"Initializing game configuration..." - השתמשו בבלוק סטטי שני כדי ליצור את המערך
levelThresholdsבגודל השווה ל-maxLevel, ואז למלא אותו כך שכל שלב דורשlevel * 100נקודות (שלב 1 דורש 100, שלב 2 דורש 200 וכן הלאה), ולהגדיר אתconfigLoadedל-true - מתודה סטטית
getThreshold(int level)שמחזירה את סף הניקוד עבור השלב הזה (השלבים ממוספרים החל מ-1) - מתודה סטטית
getMaxLevel()שמחזירה את השלב המרבי - מתודה סטטית
isConfigLoaded()שמחזירה האם ההגדרות נטענו
- מערך סטטי פרטי
Main.java: הדגימו שהבלוקים הסטטיים פועלים אוטומטית כשניגשים למחלקה. תקבלו קלט אחד: מספר שלב לבדיקה. הדפיסו ארבע שורות:Config loaded: trueאוConfig loaded: falseMax level: [maxLevel]Level [level] threshold: [threshold]Level 1 threshold: [threshold](תמיד הציגו גם את שלב 1)
תקבלו קלט אחד: מספר השלב (int) לבדיקה.
שימו לב שהודעת האתחול מודפסת לפני שכל אחד מהקוד שלכם ב-Main רץ — זהו הבלוק הסטטי שפועל כשהמחלקה נטענת לראשונה!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO: גש ל-GameConfig כדי להדגים את הרצת הבלוקים הסטטיים
// הבלוקים הסטטיים ב-GameConfig ירוצו אוטומטית בפעם הראשונה שתיגש למחלקה
// TODO: הדפס אם התצורה נטענה
// פורמט: "Config loaded: true" או "Config loaded: false"
// TODO: הדפס את הרמה המרבית
// פורמט: "Max level: [maxLevel]"
// TODO: הדפס את הסף עבור רמת הקלט
// פורמט: "Level [level] threshold: [threshold]"
// TODO: הדפס את הסף עבור רמה 1
// פורמט: "Level 1 threshold: [threshold]"
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין