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 — это статический блок выполняется при первой загрузке класса!

Шпаргалка

Статический блок (или статический инициализатор) выполняется один раз при первой загрузке класса, до создания каких-либо объектов или вызова статических методов. Он используется для сложной логики инициализации, требующей нескольких инструкций.

public class Example {
    private static String value;
    
    static {
        // Логика инициализации
        value = "initialized";
        System.out.println("Static block executed");
    }
}

Статические блоки выполняются автоматически при загрузке класса в память, только один раз, независимо от того, сколько объектов будет создано.

В классе может быть несколько статических блоков. Они выполняются в том порядке, в котором они указаны:

public class Example {
    private static int[] values;
    
    static {
        values = new int[5];
    }
    
    static {
        for (int i = 0; i < values.length; i++) {
            values[i] = i * 10;
        }
    }
}

Типичные варианты использования включают инициализацию статических массивов или коллекций, установку значений конфигурации, требующих вычислений, и выполнение разовых задач настройки на уровне класса.

Попробуйте сами

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: Выведите порог (threshold) для введенного уровня
        // Формат: "Level [level] threshold: [threshold]"
        
        // TODO: Выведите порог (threshold) для уровня 1
        // Формат: "Level 1 threshold: [threshold]"
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование