Состояние может быть не только у объектов, но и у классов. Этот механизм реализуется через статические поля, которые, в отличие от обычных полей, принадлежат не конкретному объекту, а всему классу.
public class MyClass {
public static int staticVariable = 10;
}
Синтаксически такие поля отличаются от обычных наличием ключевого слова static
перед указанием возвращаемого типа. Вызов этих полей происходит напрямую из класса, так же как и статических методов.
MyClass.staticVariable; // 10
MyClass.staticVariable = 5;
Статическое поле принадлежит классу, а не объекту. Это значит что это состояние делят между собой все объекты. Более того, доступ к этому состоянию можно получить из любой части программы в любой момент. Из-за того, что поведение статических полей похоже на поведение переменных, их иногда называют переменными класса.
Статические поля обычно используются для хранения конфигурации. Например, с их помощью можно хранить математические константы.
public class MathConstants {
public static final double PI = 3.14159;
public static final double E = 2.71828;
}
public class Application {
public static void main(String[] args) {
var circumference = 2 * MathConstants.PI * 10; // Расчет окружности круга
System.out.println(circumference);
}
}
Статические поля достаточно опасны для использования. Так как это, по сути, глобальное состояние (глобальные переменные), то мы можем получить ситуацию, когда разные части приложения используют статические поля для хранения каких-то своих данных. Соответственно нет никакого контроля над тем, как эти данные меняются, а значит очень легко получить ситуацию, когда какая-то часть кода завязанная на это состояние может перестать правильно работать из-за их изменения в другом месте. Именно по этой причине статические поля используются, в основном, как неизменяемая конфигурация.
Статический блок инициализации
В некоторых ситуациях конфигурация может быть достаточно сложной, а данные этой конфигурации могут храниться во внешних источниках. Чтобы упростить этот процесс, в Java существует статический блок инициализации, специальная конструкция внутри класса, которая вызывается при первом его использовании. Внутри нее программист может написать код заполняющий статические поля нужной ему конфигурацией. Ниже пример класса конфигурации для работы с базой данных
public class Application {
public static List<String> admins;
static {
admins = loadAdmins();
}
private static List<String> loadAdmins() {
// Какая-то логика загрузки емейлов, возможно они берутся из файла
return List.of("kirill@hexlet.io", "igor@hexlet.io");
}
}
На практике, статический блок инициализации используется нечасто. У него есть ряд недостатков связанных с обработкой ошибок и замедлением загрузки класса из-за которых его стараются избегать. Скорее вам придется работать с кодом, который его использует, чем писать самостоятельно.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.