Menu
Coddy logo textTech

בלוקים סטטיים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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;
        }
    }
}

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

challenge icon

אתגר

קל

נבנה מערכת 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: false
    • Max 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]"
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Java אונליין