Java 12.11.2023
This commit is contained in:
parent
300f663b50
commit
3c374abf6b
109
Java/Java.md
109
Java/Java.md
@ -763,3 +763,112 @@ class Transaction3<T extends Account & Accountable> { // T имплементи
|
|||||||
T account;
|
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<Person> {
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
Person(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Отриц число, если меньше, 0, если равно, и полож число, если больше
|
||||||
|
public int compareTo(Person p) {
|
||||||
|
return name.compareTo(p.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Reference in New Issue
Block a user