Код IT
← Каталог

Типы данных и переменные в Java — Записи (`record`) как типы данных

Фрагмент из «Типы данных и переменные в Java»: Записи (`record`) как типы данных.

Java main.java
// Простая запись с двумя компонентами
record Point(int x, int y) {}

// Использование записи
Point p1 = new Point(10, 20);
int x = p1.x();                  // 10 — геттер с именем компонента
int y = p1.y();                  // 20
Point p2 = new Point(10, 20);
System.out.println(p1.equals(p2)); // true — сравнение по значениям компонентов
System.out.println(p1);          // Point[x=10, y=20] — сгенерированный toString()

// Запись с дополнительным конструктором
record Person(String name, int age) {
    // Компактный конструктор для валидации
    Person {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("Некорректный возраст");
        }
    }
}

Person valid = new Person("Анна", 30); // успешно создаётся
// Person invalid = new Person("Борис", -5); // исключение

// Запись с несколькими компонентами разных типов
record Product(String id, String name, double price, boolean inStock) {}

Product laptop = new Product("P123", "Ноутбук", 59999.99, true);
String id = laptop.id();         // "P123"
double price = laptop.price();   // 59999.99

// Вложенные записи
record Address(String street, String city, String postalCode) {}
record Customer(String name, Address address, String email) {}

Address addr = new Address("Ленина, 10", "Москва", "123456");
Customer customer = new Customer("Иван Петров", addr, "ivan@example.com");
String city = customer.address().city(); // "Москва"

// Запись как возвращаемый тип метода
record CalculationResult(double sum, double average, int count) {}

CalculationResult calculate(int[] values) {
    double sum = 0;
    for (int v : values) sum += v;
    return new CalculationResult(sum, sum / values.length, values.length);
}

CalculationResult result = calculate(new int[]{10, 20, 30});
System.out.println(result.average()); // 20.0
// Простая запись с двумя компонентами
record Point(int x, int y) {}

// Использование записи
Point p1 = new Point(10, 20);
int x = p1.x();                  // 10 — геттер с именем компонента
int y = p1.y();                  // 20
Point p2 = new Point(10, 20);
System.out.println(p1.equals(p2)); // true — сравнение по значениям компонентов
System.out.println(p1);          // Point[x=10, y=20] — сгенерированный toString()

// Запись с дополнительным конструктором
record Person(String name, int age) {
    // Компактный конструктор для валидации
    Person {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("Некорректный возраст");
        }
    }
}

Person valid = new Person("Анна", 30); // успешно создаётся
// Person invalid = new Person("Борис", -5); // исключение

// Запись с несколькими компонентами разных типов
record Product(String id, String name, double price, boolean inStock) {}

Product laptop = new Product("P123", "Ноутбук", 59999.99, true);
String id = laptop.id();         // "P123"
double price = laptop.price();   // 59999.99

// Вложенные записи
record Address(String street, String city, String postalCode) {}
record Customer(String name, Address address, String email) {}

Address addr = new Address("Ленина, 10", "Москва", "123456");
Customer customer = new Customer("Иван Петров", addr, "ivan@example.com");
String city = customer.address().city(); // "Москва"

// Запись как возвращаемый тип метода
record CalculationResult(double sum, double average, int count) {}

CalculationResult calculate(int[] values) {
    double sum = 0;
    for (int v : values) sum += v;
    return new CalculationResult(sum, sum / values.length, values.length);
}

CalculationResult result = calculate(new int[]{10, 20, 30});
System.out.println(result.average()); // 20.0