Menu
Coddy logo textTech

Bloki statyczne

Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 17 z 87.

Czasami trzeba zainicjalizować zmienne statyczne za pomocą logiki bardziej złożonej niż proste przypisanie. Blok statyczny (nazywany też inicjalizatorem statycznym) wykonuje się raz, gdy klasa jest ładowana po raz pierwszy, zanim zostaną utworzone jakiekolwiek obiekty lub zostaną wywołane metody statyczne.

public class DatabaseConfig {
    private static String connectionString;
    private static int maxConnections;
    
    static {
        // Złożona logika inicjalizacji
        connectionString = "jdbc:mysql://localhost:3306/mydb";
        maxConnections = 10;
        System.out.println("Database configuration loaded");
    }
}

Blok statyczny wykonuje się automatycznie, gdy klasa zostaje załadowana do pamięci. Dzieje się to tylko raz, niezależnie od tego, ile obiektów utworzysz. Doskonale nadaje się do inicjalizacji wymagającej wielu instrukcji, obliczeń lub logiki warunkowej.

W klasie możesz mieć wiele bloków statycznych, które wykonują się w kolejności, w jakiej występują:

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;
        }
    }
}

Bloki statyczne są powszechnie używane do inicjalizowania statycznych tablic lub kolekcji, konfigurowania wartości konfiguracyjnych wymagających obliczeń oraz wykonywania jednorazowych zadań konfiguracyjnych na poziomie klasy.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system GameConfig, który używa bloków statycznych do inicjowania ustawień gry przy pierwszym wczytaniu klasy. To idealne rozwiązanie w przypadku konfiguracji, którą trzeba obliczyć lub przygotować raz, zanim zostaną utworzone jakiekolwiek obiekty gry.

Utworzysz dwa pliki, aby uporządkować kod:

  • GameConfig.java: Utwórz klasę konfiguracji, która inicjuje swoje ustawienia za pomocą bloków statycznych:
    • Prywatna tablica statyczna levelThresholds (int[]), która przechowuje liczbę punktów potrzebną do osiągnięcia każdego poziomu
    • Prywatna zmienna statyczna maxLevel (int), przechowująca łączną liczbę poziomów
    • Prywatna zmienna statyczna configLoaded (boolean), która śledzi, czy inicjalizacja została wykonana
    • Użyj bloku statycznego, aby zainicjować maxLevel wartością 5 i wypisać "Initializing game configuration..."
    • Użyj drugiego bloku statycznego, aby utworzyć tablicę levelThresholds o rozmiarze równym maxLevel, a następnie wypełnić ją tak, aby każdy poziom wymagał level * 100 punktów (poziom 1 wymaga 100, poziom 2 wymaga 200 itd.) i ustawić configLoaded na true
    • Metoda statyczna getThreshold(int level), która zwraca próg punktowy dla danego poziomu (poziomy są numerowane od 1)
    • Metoda statyczna getMaxLevel(), która zwraca maksymalny poziom
    • Metoda statyczna isConfigLoaded(), która zwraca informację, czy konfiguracja została wczytana
  • Main.java: Pokaż, że bloki statyczne są wykonywane automatycznie, gdy klasa zostaje użyta. Otrzymasz jedno wejście: numer poziomu do sprawdzenia. Wypisz cztery wiersze:
    • Config loaded: true lub Config loaded: false
    • Max level: [maxLevel]
    • Level [level] threshold: [threshold]
    • Level 1 threshold: [threshold] (zawsze pokaż również poziom 1)

Otrzymasz jedno wejście: numer poziomu (int) do sprawdzenia.

Zwróć uwagę, że komunikat inicjalizacyjny jest wypisywany, zanim wykona się jakikolwiek kod z klasy Main — to blok statyczny jest wykonywany przy pierwszym wczytaniu klasy!

Spróbuj swoich sił

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: Uzyskaj dostęp do GameConfig, aby zademonstrować wykonanie bloku statycznego
        // Bloki statyczne w GameConfig uruchomią się automatycznie przy pierwszym uzyskaniu dostępu do tej klasy
        
        // TODO: Wyświetl, czy konfiguracja jest załadowana
        // Format: "Config loaded: true" lub "Config loaded: false"
        
        // TODO: Wyświetl maksymalny poziom
        // Format: "Max level: [maxLevel]"
        
        // TODO: Wyświetl próg dla podanego poziomu
        // Format: "Level [level] threshold: [threshold]"
        
        // TODO: Wyświetl próg dla poziomu 1
        // Format: "Level 1 threshold: [threshold]"
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Java online