Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Статические поля Java: Классы

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

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

На практике, статический блок инициализации используется нечасто. У него есть ряд недостатков связанных с обработкой ошибок и замедлением загрузки класса из-за которых его стараются избегать. Скорее вам придется работать с кодом, который его использует, чем писать самостоятельно.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 16 мая

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу