diff --git a/Java/Java.md b/Java/Java.md index 846d496..d1548ca 100644 --- a/Java/Java.md +++ b/Java/Java.md @@ -763,3 +763,112 @@ class Transaction3 { // T имплементи T account; } ``` + +## Records + +> Записи или Records позволяют быстро содздавать классы, уменьшая количесво бойлерплейта. Записи автоматически определяют инициализатор, методы hashCode, toString и equals. Поля являются *private* и *final* и имеют одноимённые геттеры + +```Java +record Person(String name, int age) { } +``` + +Можно добавить дополнительную логику в созданный конструктор + +```Java +record Person(String name, int age) { + Person { + if(age < 1 || age > 110) { + age = 18; + } + } +} +``` + +Можно полностью переписать изначальный конструктор + +```Java +record Person(String name, int age) { + Person(String name, int age) { + this.name = name; + if(age < 1 || age > 110) { + age = 18; + } + this.age = age; + } +} +``` + +Мы можем определять какие-то другие конструкторы, но они вызывать канонический конструктор + +```Java +record Person(String name, int age) { + Person(String firstName, String lastName, int age) { + this(firstName + " " + lastName, age); + } +} +``` + +Можно также переопределить остальные методы + +```Java +record Person(String name, int age) { + public String name() { + return "Mister " + name; + } + + public String toString() { + return "What a fine gentleman we have here" + } +} +``` + +### Ограничения record + +Классы *record* не могут наследовать, быть наследованными и абстрактными, но могут имплементировать интерфейсы. Нельзя добавлять дополнительные нестатические пора и инициализаторы + +```Java +record Person(String name, int age) { + static int minAge; + + static { // Это статический инициализатор + minAge = 18; + } +} +``` + +## Upcasting & Downcasting + +```Java +class Person {} + +class Employee {} + +class Main { + public static void main(String[] args) { + Object bob = new Person(); // Upcasting + Person tom = new Employee(); // тоже upcasting + Person bob2 = (Person)bob; + } +} +``` + +## Comparator & Comparable + +```Java +class Person implements Comparable { + private String name; + + Person(String name) { + this.name = name; + } + + String getName() { + return name; + } + + // Отриц число, если меньше, 0, если равно, и полож число, если больше + public int compareTo(Person p) { + return name.compareTo(p.getName()); + } +} +```