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.