Статические блоки
Часть раздела Объектно-ориентированное программирование путешествия по 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 — это статический блок выполняется при первой загрузке класса!
Шпаргалка
Статический блок (или статический инициализатор) выполняется один раз при первой загрузке класса, до создания каких-либо объектов или вызова статических методов. Он используется для сложной логики инициализации, требующей нескольких инструкций.
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]"
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»