🖥 Новые возможности конструкторов в Java (часть 1)



Не так давно в 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