Компактный конструктор record
Компактный конструктор record используется внутри
объявления записи для выполнения проверок, нормализации
или вычислений над компонентами до их присваивания полям.
Его главная особенность в том, что в заголовке конструктора
не указываются параметры - они автоматически совпадают
с компонентами записи. В теле компактного конструктора
доступны имена этих компонентов как локальные переменные,
а в конце компилятор сам добавляет присваивание
this.component = component для каждого компонента.
Если нужно изменить значение компонента перед сохранением,
переменной с именем компонента можно присвоить новое значение.
Синтаксис
public record Name(Type component1, Type component2)
{
public Name
{
// checks and normalization
// optional reassignment of component variables
}
}
Пример
Давайте создадим запись Point с компактным
конструктором, который проверяет, что координаты
неотрицательны:
public class Main
{
public record Point(int x, int y)
{
public Point
{
if (x < 0 || y < 0)
{
throw new IllegalArgumentException("negative");
}
}
}
public static void main(String[] args)
{
Point p = new Point(2, 3);
System.out.println(p);
}
}
Результат выполнения кода:
Point[x=2, y=3]
Пример
Давайте в компактном конструкторе нормализуем строку, приводя её к нижнему регистру и обрезая пробелы:
public class Main
{
public record User(String name)
{
public User
{
name = name.trim().toLowerCase();
}
}
public static void main(String[] args)
{
User u = new User(" ABCDE ");
System.out.println(u);
}
}
Результат выполнения кода:
User[name=abcde]
Пример
Давайте создадим запись Range, в компактном
конструкторе которой меняем местами границы, если
начало больше конца:
public class Main
{
public record Range(int from, int to)
{
public Range
{
if (from > to)
{
int temp = from;
from = to;
to = temp;
}
}
}
public static void main(String[] args)
{
Range r = new Range(5, 1);
System.out.println(r);
}
}
Результат выполнения кода:
Range[from=1, to=5]
Смотрите также
-
ключевое слово
record,
которое объявляет запись -
понятие
компонент записи,
который задаёт поле и аксессор -
обычный
конструктор,
который явно принимает параметры -
ключевое слово
this,
которое ссылается на текущий объект