Gymterview
middle

Flexible Constructor Bodies

Flexible Constructor Bodies (финализировано в Java 25) позволяют выполнять код до вызова super() или this() в конструкторе — валидацию аргументов, подготовку параметров, логирование. Ранее super()/this() обязательно были первым оператором.

Пример
// До Java 25 — super() обязан быть первым
public class PositiveInteger extends Number {
    public PositiveInteger(int value) {
        // if (value <= 0) throw ...; // НЕЛЬЗЯ до super()!
        super();
        if (value <= 0) throw new IllegalArgumentException("Must be positive");
        this.value = value;
    }
}

// Java 25 — код до super()
public class PositiveInteger extends Number {
    public PositiveInteger(int value) {
        if (value <= 0) {
            throw new IllegalArgumentException("Must be positive: " + value);
        }
        super(); // теперь может быть не первым
        this.value = value;
    }
}

Практический пример — подготовка аргументов для super()

Пример
public class NamedLogger extends AbstractLogger {
    public NamedLogger(String rawName) {
        var cleanName = rawName.strip().toLowerCase();
        if (cleanName.isEmpty()) {
            throw new IllegalArgumentException("Name cannot be blank");
        }
        super(cleanName); // передаём обработанное значение
    }
}

Ограничения кода до super()

Можно Нельзя
Валидировать аргументы Обращаться к this
Подготовить параметры для super() Вызывать instance-методы
Логировать Присваивать instance-поля
Вычислять локальные переменные Читать instance-поля

Частые ошибки

  • Обращение к this до super() — ошибка компиляции; объект не инициализирован
  • Инициализация полей до super() — невозможно; this.field = value до super() запрещено

Как используется в 2026

  • Упрощает конструкторы — не нужны static factory methods для валидации перед super()
  • Особенно полезно для Records с валидацией и наследования

На собеседовании: объясните проблему (раньше приходилось выносить валидацию в static-методы или делать её после super()), решение (код до super()) и ограничение (нет доступа к this). Вопрос показывает, что кандидат следит за новыми версиями Java.