Java: Классы
Теория: Статические поля
Состояние может быть не только у объектов, но и у классов. Этот механизм реализуется через статические поля, которые, в отличие от обычных полей, принадлежат не конкретному объекту, а всему классу.
Синтаксически такие поля отличаются от обычных наличием ключевого слова static перед указанием возвращаемого типа. Вызов этих полей происходит напрямую из класса, так же как и статических методов.
Статическое поле принадлежит классу, а не объекту. Это значит что это состояние делят между собой все объекты. Более того, доступ к этому состоянию можно получить из любой части программы в любой момент. Из-за того, что поведение статических полей похоже на поведение переменных, их иногда называют переменными класса.
Статические поля обычно используются для хранения конфигурации. Например, с их помощью можно хранить математические константы.
Статические поля достаточно опасны для использования. Так как это, по сути, глобальное состояние (глобальные переменные), то мы можем получить ситуацию, когда разные части приложения используют статические поля для хранения каких-то своих данных. Соответственно нет никакого контроля над тем, как эти данные меняются, а значит очень легко получить ситуацию, когда какая-то часть кода завязанная на это состояние может перестать правильно работать из-за их изменения в другом месте. Именно по этой причине статические поля используются, в основном, как неизменяемая конфигурация.
Статический блок инициализации
В некоторых ситуациях конфигурация может быть достаточно сложной, а данные этой конфигурации могут храниться во внешних источниках. Чтобы упростить этот процесс, в Java существует статический блок инициализации, специальная конструкция внутри класса, которая вызывается при первом его использовании. Внутри нее программист может написать код заполняющий статические поля нужной ему конфигурацией. Ниже пример класса конфигурации для работы с базой данных
На практике, статический блок инициализации используется нечасто. У него есть ряд недостатков связанных с обработкой ошибок и замедлением загрузки класса из-за которых его стараются избегать. Скорее вам придется работать с кодом, который его использует, чем писать самостоятельно.


