TGViewer
Spring АйО Spring АйО @spring_aio · 11K subscribers
Post #100 3.02K
🖥 Новые возможности конструкторов в Java (часть 2)

Не так давно мы рассказывали про гибкие конструкторы в Java. В 23 версии Java появится возможность инициализировать поля в том же классе перед явным вызовом конструктора (JEP-482). А пока эта фича не реализована, мы вынуждены использовать вспомогательные методы, если нам необходимо проиницизировать поля.

Рассмотрим класс, который принимает аргумент типа Certificate и должен преобразовать его в массив байтов для конструктора суперкласса.

Java ≤ 22:


public class Sub extends Super {

private static byte[] prepareByteArray(Certificate certificate) {
var publicKey = certificate.getPublicKey();
if (publicKey == null) throw new IllegalArgumentException(..);
return switch (publicKey) {
case RSAKey rsaKey -> ...
case DSAPublicKey dsaKey -> ...
default -> ...
};
}

public Sub(Certificate certificate) {
super(prepareByteArray(certificate));
}

}


В коде выше метод prepareByteArray выполняет необходимую подготовку аргументов. Затем этот метод вызывается внутри конструктора Sub как часть вызова super.

Java ≥ 23:

Можно будет сделать тоже самое, но без дополнительных “приседаний” в виде вынесения логики которую мы хотим выполнить в конструкторе в отдельный метод:


public class Sub extends Super {
public Sub(Certificate certificate) {
var publicKey = certificate.getPublicKey();
if (publicKey == null) throw new IllegalArgumentException(..);
byte[] certBytes = switch (publicKey) {
case RSAKey rsaKey -> ...
case DSAPublicKey dsaKey -> ...
default -> ...
};
super(certBytes);
}
}


Также иногда возникает необходимость передать одно и то же значение в несколько аргументов конструктора суперкласса. Ранее это можно было сделать только с использованием вспомогательного конструктора.

Рассмотрим пример, связанный с системой регистрации студентов в университете. У нас есть базовый класс Person, который представляет человека, и класс Student, который наследует Person. Каждый студент имеет идентификатор, который также используется в качестве номера студенческого билета и учетной записи в университете

Java ≤ 22:


class Person {
private String id;
private String accountId;

public Person(String id, String accountId) {
this.id = id;
this.accountId = accountId;
}
}

class Student extends Person {
private Student(String id) {
super(id, id); // Передача одного и того же значения дважды
}

public Student(String firstName, String lastName) {
this(generateStudentId(firstName, lastName));
}

private static String generateStudentId(String firstName, String lastName) {
// Генерация уникального идентификатора студента
return firstName + ", " + lastName + "-" + System.currentTimeMillis();
}
}


В этом примере вспомогательный конструктор Student(String id) используется для передачи одного и того же id в два аргумента конструктора суперкласса Person.

Java ≥ 23:


class Person {
private String id;
private String accountId;

public Person(String id, String accountId) {
this.id = id;
this.accountId = accountId;
}
}

class Student extends Person {
public Student(String firstName, String lastName) {
String id = generateStudentId(firstName, lastName);
super(id, id); // Передача одного и того же значения дважды
}

private static String generateStudentId(String firstName, String lastName) {
// Генерация уникального идентификатора студента
return firstName + ", " + lastName + "-" + System.currentTimeMillis();
}
}


Ставьте 🔥 если понравился пост и вы были бы рады видеть больше разборов JEP

#Java #JEP
  • 🔥 40
  • 👍 3
  • ❤ 2
More from @spring_aio
  1. Oct 16, 2026😀 Joker 2026 && Spring АйО 🍃 Два дня в Петербурге пролетели быстрее, чем прогрев JVM. До…
  2. Oct 11, 2026🎬 Записи докладов с JPoint 2026 уже в открытом доступе JUG Ru Group выложили записи с про…
  3. Oct 9, 2026👩‍💻 Kotlin получил почти настоящие статики Начиная с Kotlin 2.5.0-Beta1 можно эксперимен…
  4. Oct 8, 2026🍃 Spring Boot ломает совместимость, G1 тормозит микросервисы, Java долго релизит фичи | S…
  5. Oct 6, 2026👩‍💻 Spring Config Import без магии У наших друзей из Axelix вышла статья о том, как Spri…
  6. Oct 5, 2026🥲 В Java 27 TLS научился переживать квантовую атаку При установке HTTPS-соединения клиент…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →