Не так давно в Java была добавлена интересная возможность для конструкторов. Теперь в них можно размещать операторы перед явным вызовом другого конструктора, такого как
super(..)
или this(..)
. Эта фича была предложена в JEP 447 и впервые представлена в качестве preview-фичи в JDK 22. Ранее в Java вызов конструктора суперкласса (
super(..)
) или другого конструктора текущего класса (this(..)
) должен был быть первой строкой в теле конструктора. Другими словами, до вызова конструктора нельзя было выполнять никакие проверки или инициализации:
public class PositiveBigInteger extends BigInteger {
public PositiveBigInteger(long value) {
super(value); // Вызов конструктора суперкласса должен быть первым
if (value <= 0) throw new IllegalArgumentException("Value must be positive");
}
}
Начиная с Java 22 мы можем сначала выполнять проверки или инициализацию, и только затем обращаться к конструктору суперкласса:
public class PositiveBigInteger extends BigInteger {
public PositiveBigInteger(long value) {
if (value <= 0) throw new IllegalArgumentException("Value must be positive");
super(value);
}
}
Благодаря этой фичи мы можем улучшить читаемость и поддержку кода, размещая логику валидации и подготовки аргументов там, где нам это действительно нужно.
Но у этой фичи есть некоторые ограничения. Например, мы не можем ссылаться на создаваемый экземпляр и инициализировать его поля до обращения к
super(..)
или this(..)
.
class A {
int i;
A() {
this.i++; // Ошибка
this.hashCode(); // Ошибка
System.out.print(this); // Ошибка
super();
}
}
В Java 23 эту фичу предлагают протестировать повторно с одним значительным изменением: позволить телу конструктора инициализировать поля класса до явного вызова другого конструктора. Про это мы расскажем в следующей части этого поста.
Ставьте 🔥 если хотите вторую часть!
#Java #JEP