ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Java ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
π ΠΠ°ΠΉΡΡ Π°ΠΊΠΈ, ΠΏΡΠΈΡΠΌΡ ΠΈ Π»ΡΡΡΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π΄Π»Ρ Java-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ². ΠΡΡ, ΡΡΠΎ ΡΡΠΊΠΎΡΠΈΡ ΠΊΠΎΠ΄ ΠΈ ΠΏΡΠΎΠΊΠ°ΡΠ°Π΅Ρ Π½Π°Π²ΡΠΊΠΈ. Java, Spring, Maven, Hibernate. ΠΠΎ Π²ΡΠ΅ΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ @evgenycarter Π ΠΠ clck.ru/3KoGeP
Show moreπ Analytical overview of Telegram channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Java ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
Channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Java ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (@bookjava) in the Russian language segment is an active participant. Currently, the community unites 10 006 subscribers, ranking 12 158 in the Technologies & Applications category and 63 521 in the Russia region.
π Audience metrics and dynamics
Since its creation on Π½Π΅Π²ΡΠ΄ΠΎΠΌΠΎ, the project has demonstrated rapid growth, gathering an audience of 10 006 subscribers.
According to the latest data from 26 October, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -56 over the last 30 days and by -1 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 8.06%. Within the first 24 hours after publication, content typically collects 4.04% reactions from the total number of subscribers.
- Post reach: On average, each post receives 806 views. Within the first day, a publication typically gains 404 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
- Thematic interests: Content is focused on key topics such as string, ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΡΡΡΠΎΠΊΠ°, boot, api.
π Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
βπ ΠΠ°ΠΉΡΡ
Π°ΠΊΠΈ, ΠΏΡΠΈΡΠΌΡ ΠΈ Π»ΡΡΡΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π΄Π»Ρ Java-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ². ΠΡΡ, ΡΡΠΎ ΡΡΠΊΠΎΡΠΈΡ ΠΊΠΎΠ΄ ΠΈ ΠΏΡΠΎΠΊΠ°ΡΠ°Π΅Ρ Π½Π°Π²ΡΠΊΠΈ. Java, Spring, Maven, Hibernate.
ΠΠΎ Π²ΡΠ΅ΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ @evgenycarter
Π ΠΠ clck.ru/3KoGePβ
Thanks to the high frequency of updates (latest data received on 27 October, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
record β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ ΠΊΠ»Π°ΡΡΠ°, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
. ΠΠ½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ:
β
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
β
ΠΠ΅ΡΡΠ΅ΡΡ (Π½ΠΎ Π±Π΅Π· get Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ)
β
equals(), hashCode(), toString()
πΉ ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
public record User(String name, int age) {}
ΠΡΠΎΡ ΠΊΠΎΠ΄ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ΅Π½ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Ρ ΠΏΠΎΠ»ΡΠΌΠΈ, ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠΌ, Π³Π΅ΡΡΠ΅ΡΠ°ΠΌΠΈ ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ equals/hashCode/toString, Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ!
πΉ ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° record
π ΠΠ΅Π½ΡΡΠ΅ ΠΊΠΎΠ΄Π° β Π½ΠΈΠΊΠ°ΠΊΠΈΡ
Π±ΠΎΠΉΠ»Π΅ΡΠΏΠ»Π΅ΠΉΡΠΎΠ²
π ΠΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΡ β Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ
π Π§ΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ β ΡΡΠ°Π·Ρ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
πΉ ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ:
β ΠΠΎΠ»Ρ record Π²ΡΠ΅Π³Π΄Π° final
β ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ record Π·Π°ΠΏΡΠ΅ΡΠ΅Π½ΠΎ
π² ΠΡ Π² MAX
π@BookJavamap(), filter() ΠΈ collect(). ΠΠ°Π²Π°ΠΉ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ 5 ΠΏΠΎΠ»Π΅Π·Π½ΡΡ
ΡΡΡΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΡΠ»Π΅Π³Π°Π½ΡΠ½Π΅Π΅ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅!
πΉ 1. ΠΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² (Collectors.groupingBy)
Π Π°Π·Π±ΠΈΠ²Π°Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠΎΠΊ Π½Π° Π³ΡΡΠΏΠΏΡ ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅:
List<String> words = List.of("apple", "banana", "cat", "dog", "elephant");
Map<Integer, List<String>> grouped = words.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(grouped);
// {3=[cat, dog], 5=[apple], 6=[banana], 8=[elephant]}
πΉ 2. Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ (distinct())
Π€ΠΈΠ»ΡΡΡΡΠ΅ΠΌ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΡ Π² ΠΏΠΎΡΠΎΠΊΠ΅:
List<Integer> numbers = List.of(1, 2, 2, 3, 4, 4, 5);
List<Integer> unique = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(unique); // [1, 2, 3, 4, 5]
πΉ 3. ΠΡΠΎΠΏΡΡΠΊ N ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² (skip(n))
Π₯ΠΎΡΠΈΠΌ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΠΏΠ΅ΡΠ²ΡΠ΅ 3 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π²Π·ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ:
List<String> names = List.of("Alice", "Bob", "Charlie", "David", "Eve");
List<String> skipped = names.stream()
.skip(3)
.collect(Collectors.toList());
System.out.println(skipped); // [David, Eve]
πΉ 4. ΠΠ°ΠΉΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (max())
ΠΠΎΠΏΡΡΡΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΡΠ΅Π», Π½Π°ΠΉΠ΄Π΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅:
List<Integer> nums = List.of(10, 20, 30, 5, 15);
Optional<Integer> maxNum = nums.stream().max(Integer::compareTo);
maxNum.ifPresent(System.out::println); // 30
πΉ 5. ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π»ΠΈ ΡΠΏΠΈΡΠΎΠΊ Π½ΡΠΆΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (anyMatch())
ΠΠΎΠΏΡΡΡΠΈΠΌ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π΅ΡΡΡ Π»ΠΈ Π² ΡΠΏΠΈΡΠΊΠ΅ ΡΠΈΡΠ»ΠΎ Π±ΠΎΠ»ΡΡΠ΅ 100:
List<Integer> nums = List.of(10, 50, 200, 30);
boolean hasLargeNumber = nums.stream().anyMatch(n -> n > 100);
System.out.println(hasLargeNumber); // true
π₯ Stream API β ΡΡΠΎ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡΠΌΠΈ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π΅Π³ΠΎ, ΠΈ Π²Π°Ρ ΠΊΠΎΠ΄ ΡΡΠ°Π½Π΅Ρ ΡΠΈΡΠ΅, ΠΊΠΎΡΠΎΡΠ΅ ΠΈ Π±ΡΡΡΡΠ΅Π΅!
π² ΠΡ Π² MAX
π@BookJava
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
β‘ ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Spring Bean, Hibernate SessionFactory.
2οΈβ£ Factory Method
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±Π΅Π· ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ. ΠΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΠΎΠ±ΡΠ΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ.
πΉ ΠΡΠΈΠΌΠ΅Ρ:
interface Product {
void create();
}
class ConcreteProductA implements Product {
public void create() { System.out.println("Π‘ΠΎΠ·Π΄Π°Π½ ΠΏΡΠΎΠ΄ΡΠΊΡ A"); }
}
class ProductFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) return new ConcreteProductA();
throw new IllegalArgumentException("ΠΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΡΠΈΠΏ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°");
}
}
β‘ ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² JDBC (DriverManager.getConnection).
3οΈβ£ Builder
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎ. ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π΄Π»ΠΈΠ½Π½ΡΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌ Ρ ΠΊΡΡΠ΅ΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
πΉ ΠΡΠΈΠΌΠ΅Ρ (Lombok @Builder Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ ΠΏΡΠΎΡΠ΅!):
@Builder
public class Car {
private String model;
private int year;
private String engine;
}
Car car = Car.builder().model("Tesla").year(2024).engine("Electric").build();
β‘ ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² StringBuilder, HttpRequest Π² Java 11+.
4οΈβ£ Observer
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° ΡΠΎΠ±ΡΡΠΈΡ ΠΈ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° Π½ΠΈΡ
. Π§Π°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² GUI, event-driven ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
.
πΉ ΠΡΠΈΠΌΠ΅Ρ (Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»Ρ Π·Π° ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ):
interface Observer {
void update(String message);
}
class User implements Observer {
private String name;
public User(String name) { this.name = name; }
public void update(String message) {
System.out.println(name + " ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅: " + message);
}
}
class Channel {
private List<Observer> observers = new ArrayList<>();
public void subscribe(Observer o) { observers.add(o); }
public void notifyAll(String message) {
for (Observer o : observers) { o.update(message); }
}
}
β‘ ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Spring Events, RxJava.
5οΈβ£ Decorator
ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΅Π³ΠΎ ΡΡΡΡΠΊΡΡΡΡ. Π§Π°ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² Π»ΠΎΠ³Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠΎΡΠΎΠΊΠ°Ρ
IO.
πΉ ΠΡΠΈΠΌΠ΅Ρ (Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Π΅ΡΡΠΊΠΈ Π½Π°Π΄ OutputStream):
class LoggingOutputStream extends OutputStream {
private OutputStream wrapped;
public LoggingOutputStream(OutputStream wrapped) { this.wrapped = wrapped; }
@Override
public void write(int b) throws IOException {
System.out.println("ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π±Π°ΠΉΡ: " + b);
wrapped.write(b);
}
}
β‘ ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² BufferedReader, Logger, Spring Security Filters.
ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΠΈΡΠ°ΡΡ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ΄, ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
π² ΠΡ Π² MAX
π@BookJavarecord Π»ΡΡΡΠ΅ class Π² Java?
Π Java 14 ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ record β Π½ΠΎΠ²ΡΠΉ ΡΠΈΠΏ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
. Π§Π΅ΠΌ ΠΎΠ½ Π»ΡΡΡΠ΅ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ class? ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΡΠΌΡΡ!
πΉ ΠΠ°ΠΏΠΈΡΡ ΠΏΡΠΎΡΠΈΠ² ΠΊΠ»Π°ΡΡΠ°
ΠΠ±ΡΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ:
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
ΠΠ½ΠΎΠ³ΠΎ Π±ΠΎΠΉΠ»Π΅ΡΠΏΠ»Π΅ΠΉΡΠ°β¦
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Ρ record:
record Person(String name, int age) {}
β
ΠΠ΅Π½ΡΡΠ΅ ΠΊΠΎΠ΄Π°
β
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ toString(), equals(), hashCode()
β
ΠΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
β οΈ ΠΠΎΠ³Π΄Π° ΠΠ ΡΡΠΎΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ record?
- ΠΡΠ»ΠΈ Π½ΡΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
- ΠΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ»ΠΎΠΆΠ½Π°Ρ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠ° Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ°
ΠΡ ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ record Π² ΡΠ²ΠΎΠΈΡ
ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
? ΠΠ΅Π»ΠΈΡΠ΅ΡΡ ΠΎΠΏΡΡΠΎΠΌ! π
π² ΠΡ Π² MAX
π@BookJavaCompletableFuture: ΠΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΡΡΡ Π² Java Π±Π΅Π· Π±ΠΎΠ»ΠΈ
ΠΡΠΈΠ²Π΅Ρ, ΠΊΠΎΠ»Π»Π΅Π³ΠΈ! Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ CompletableFuture, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΏΠΈΡΠ°ΡΡ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ ΠΊΠΎΠ΄ Π² Java Π±Π΅Π· ΠΊΠΎΠ»Π»Π±ΡΠΊΠΎΠ² ΠΈ ΠΏΠΎΡΠ΅ΡΡ Π² ΡΠΈΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΠΈ.
π 1. ΠΠΎΡΠ΅ΠΌΡ CompletableFuture?
Π Java Π΄Π°Π²Π½ΠΎ Π΅ΡΡΡ Future, Π½ΠΎ ΠΎΠ½ Π½Π΅ΡΠ΄ΠΎΠ±Π΅Π½:
β ΠΠ΅Π»ΡΠ·Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π΄Π°Ρ.
β ΠΠ»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ .get().
β ΠΠ΅Ρ ΡΠ΄ΠΎΠ±Π½ΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ².
π CompletableFuture ΡΠ΅ΡΠ°Π΅Ρ Π²ΡΠ΅ ΡΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ Π·Π°Π΄Π°ΡΠΈ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ.
π 2. ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
import java.util.concurrent.CompletableFuture;
public class AsyncExample {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
sleep(2000);
return "ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ!";
});
future.thenAccept(result -> System.out.println("Π Π΅Π·ΡΠ»ΡΡΠ°Ρ: " + result));
System.out.println("ΠΡΠΎΡ ΡΠ΅ΠΊΡΡ Π²ΡΠ²Π΅Π΄Π΅ΡΡΡ ΡΠ°Π½ΡΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°!");
sleep(3000); // Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΠ»Π°ΡΡ ΡΠ°Π½ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
}
private static void sleep(int ms) {
try { Thread.sleep(ms); } catch (InterruptedException ignored) {}
}
}
πΉ ΠΠ΄Π΅ΡΡ supplyAsync() Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π·Π°Π΄Π°ΡΡ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅, Π° thenAccept() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
π 3. ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π·Π°Π΄Π°Ρ
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
CompletableFuture<String> result = future1.thenCombine(future2, (s1, s2) -> s1 + " " + s2);
System.out.println(result.join()); // Hello World
β
thenCombine() ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π΄Π²ΡΡ
Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΡ
Π·Π°Π΄Π°Ρ.
π 4. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ (exceptionally)
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
if (Math.random() > 0.5) {
throw new RuntimeException("Π§ΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ!");
}
return "ΠΡΠ΅ Ρ
ΠΎΡΠΎΡΠΎ!";
}).exceptionally(ex -> "ΠΡΠΈΠ±ΠΊΠ°: " + ex.getMessage());
System.out.println(future.join());
β
ΠΡΠ»ΠΈ Π² supplyAsync() ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°, ΠΎΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π΅ΡΡΡ Π² exceptionally(), ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ ΡΠΏΠ°Π΄ΡΡ.
π 5. ΠΠ°ΠΏΡΡΠΊ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π·Π°Π΄Π°Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ
CompletableFuture<Void> allTasks = CompletableFuture.allOf(
CompletableFuture.runAsync(() -> sleepAndPrint("ΠΠ°Π΄Π°ΡΠ° 1", 1000)),
CompletableFuture.runAsync(() -> sleepAndPrint("ΠΠ°Π΄Π°ΡΠ° 2", 2000)),
CompletableFuture.runAsync(() -> sleepAndPrint("ΠΠ°Π΄Π°ΡΠ° 3", 1500))
);
allTasks.join(); // ΠΠΎΠΆΠ΄ΡΠΌΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ
Π·Π°Π΄Π°Ρ
private static void sleepAndPrint(String msg, int ms) {
try { Thread.sleep(ms); } catch (InterruptedException ignored) {}
System.out.println(msg);
}
β
allOf() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π΄Π°Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ ΠΈ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ ΠΈΡ
Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ.
π ΠΡΠΎΠ³
πΉ CompletableFuture β ΡΡΠΎ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΡΡΡΡ Π² Java.
πΉ ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ Π·Π°Π΄Π°ΡΠΈ.
πΉ Π£Π»ΡΡΡΠ°Π΅Ρ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ ΠΊΠΎΠ΄Π° ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Future ΠΈ ExecutorService.
π² ΠΡ Π² MAX
π@BookJavaOptional<T> Π² Java β ΡΡΠΎ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌΠΈ null Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π½ΠΎ ΡΠ°ΡΡΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΡΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ Π»ΡΡΡΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ.
β ΠΠ»ΠΎΡ
ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ:
1οΈβ£ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Optional ΠΊΠ°ΠΊ ΠΏΠΎΠ»Ρ Π² ΠΊΠ»Π°ΡΡΠ΅
class User {
Optional<String> name; // β ΠΠ»ΠΎΡ
Π°Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°
}
ΠΡΡΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ String, Π° Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ, ΡΠΎ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² Optional ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅.
2οΈβ£ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ isPresent() Π²ΠΌΠ΅ΡΡΠΎ ifPresent()
if (optionalValue.isPresent()) {
process(optionalValue.get()); // β ΠΠ΅ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ
}
ΠΡΡΡΠ΅ ΡΠ°ΠΊ:
optionalValue.ifPresent(this::process); // β
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄
π Π₯ΠΎΡΠΎΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
public Optional<User> findUserById(int id) {
return Optional.ofNullable(userRepository.get(id));
}
π‘ ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Optional ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ NullPointerException ΠΈ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠ΄ ΡΠΈΡΠ΅.
π₯ Π ΠΊΠ°ΠΊ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Optional? ΠΠΈΡΠΈΡΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ
! π
π² ΠΡ Π² MAX
π@BookJavaConcurrentHashMap Π»ΡΡΡΠ΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ, ΡΠ΅ΠΌ HashMap, ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π²Π½ΡΡΡΠΈ.
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ HashMap, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ ΠΊ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌ ΡΠΈΠΊΠ»Π°ΠΌ ΠΏΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ConcurrentHashMap ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠ°ΡΡΡΠΌΠΈ ΠΊΠ°ΡΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π±Π΅Π· ΠΏΠΎΠ»Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π²ΡΠ΅ΠΉ ΡΡΡΡΠΊΡΡΡΡ.
π ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ:
- ΠΠ΅Π»ΠΈΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ (Π΄ΠΎ JDK 8 ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ synchronized ΠΈ CAS ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (Π½Π°ΡΠΈΠ½Π°Ρ Ρ JDK 8).
- Π§ΡΠ΅Π½ΠΈΠ΅ (get()) Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ.
- ΠΠ°ΠΏΠΈΡΡ (put()) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ.
- ΠΠ΅Ρ null ΠΊΠ»ΡΡΠ΅ΠΉ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ (Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ HashMap).
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
import java.util.concurrent.ConcurrentHashMap;
public class Main {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("Java", 1);
map.put("Python", 2);
map.put("C++", 3);
System.out.println(map.get("Java")); // 1
}
}
π² ΠΡ Π² MAX
π@BookJavatry-catch), Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΡΠ²ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° (Ρ ΠΏΠΎΠΌΠΎΡΡΡ throws). ΠΡΠ»ΠΈ ΡΡΠΎΠ³ΠΎ Π½Π΅ ΡΠ΄Π΅Π»Π°ΡΡ, ΠΊΠΎΠ΄ Π½Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ.
- Unchecked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΈΡ
ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ»ΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ. ΠΠ±ΡΡΠ½ΠΎ ΠΎΠ½ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΈΠ·-Π·Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΎΡΠΈΠ±ΠΎΠΊ Π² ΠΊΠΎΠ΄Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, NullPointerException, ArrayIndexOutOfBoundsException).
2. ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
- Checked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½Ρ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΡΠ°ΠΊΡΠΎΡΠ°ΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ-Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ, ΡΠ΅ΡΠ΅Π²ΡΠΌΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΠΌΠΈ) ΠΈ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ Π² Ρ
ΠΎΠ΄Π΅ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ ΠΈ Π½Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ, ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ Π²Π²Π΅ΡΡ
ΠΏΠΎ ΡΡΠ΅ΠΊΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ², ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΠ΅Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ.
- Unchecked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°ΡΡΠΎ Π²ΡΠ·Π²Π°Π½Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ Π² ΠΊΠΎΠ΄Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ»Ρ, ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ null). ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ ΠΈ Π½Π΅ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΡΠ²Π°Π΅ΡΡΡ, ΠΎΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ Π²Π²Π΅ΡΡ
ΠΏΠΎ ΡΡΠ΅ΠΊΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ², Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΡ
Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠΌΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
3. ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅
- Checked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΡΡ Exception (Π½ΠΎ Π½Π΅ RuntimeException), ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌΡΠΌΠΈ.
- Unchecked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΡΡ RuntimeException ΠΈΠ»ΠΈ Error, ΡΠ²Π»ΡΡΡΡΡ Π½Π΅ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌΡΠΌΠΈ.
4. ΠΡΠΈΠΌΠ΅ΡΡ
- Checked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: IOException, SQLException, ClassNotFoundException.
- Unchecked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException.
5. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
- Checked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, Π²Ρ ΠΎΠ±ΡΠ·Π°Π½Ρ ΡΠ²Π½ΠΎ ΠΈΡ
ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠΎΠΉΡΠΈΠ²ΡΠΌ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ Π΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΌ.
- Unchecked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, ΠΈΡ
ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌΠΈ Π² ΠΊΠΎΠ΄Π΅.
6. ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
- ΠΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π·Π½ΠΈΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ checked ΠΈ unchecked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Π‘ΡΠΎΠΈΠΌΠΎΡΡΡ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Π° Π΄Π»Ρ ΠΎΠ±ΠΎΠΈΡ
ΡΠΈΠΏΠΎΠ².
ΠΡΠΎΠ³
- Checked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Ρ ΠΈΠ»ΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ, ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ recoverable (Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΡΡ
) ΡΠΈΡΡΠ°ΡΠΈΠΉ.
- Unchecked ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ, ΡΠ°ΡΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΈΠ·-Π·Π° ΠΎΡΠΈΠ±ΠΎΠΊ Π² ΠΊΠΎΠ΄Π΅ ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠΌΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Ρ.
ΠΠ±Π° ΡΠΈΠΏΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ ΡΡ
ΠΎΠΆΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π½ΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
π² ΠΡ Π² MAX
π@BookJavaInteger.valueOf(int) ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ -128 Π΄ΠΎ 127 ΠΊΡΡΠΈΡΡΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ ΡΡΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ.
Π Π°Π·ΠΌΠ΅Ρ ΠΊΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠΈΠΈ -XX:AutoBoxCacheMax=<ΡΠ°Π·ΠΌΠ΅Ρ>. π₯
π² ΠΡ Π² MAX
π@BookJavaYearMonth, ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ Π΄Π΅Π½Ρ, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ datesUntil(), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Stream Π²ΡΠ΅Ρ
Π΄Π½Π΅ΠΉ Π΄ΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π΄Π°ΡΡ.
π² ΠΡ Π² MAX
π@BookJavaint, double, char): ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΊΠΎΠΏΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Π½Π΅ Π²Π»ΠΈΡΡΡ Π½Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ.
β
ΠΠ±ΡΠ΅ΠΊΡΡ (ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ²): ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΊΠΎΠΏΠΈΡ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ, Π° Π½Π΅ ΡΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠ½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π½ΠΎ Π½Π΅Π»ΡΠ·Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΌΡ ΡΡΡΠ»ΠΊΡ Π½Π° Π½Π΅Π³ΠΎ.
π ΠΡΠΈΠΌΠ΅ΡΡ
πΉ ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ)
public class Test {
public static void modifyPrimitive(int num) {
num = 10; // ΠΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅
}
public static void main(String[] args) {
int x = 5;
modifyPrimitive(x);
System.out.println(x); // ΠΡΠ²Π΅Π΄Π΅Ρ: 5 (Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ)
}
}
πΉ ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ° (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΡΡΡ)
class Person {
String name;
}
public class Test {
public static void modifyObject(Person p) {
p.name = "Alice"; // ΠΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
}
public static void main(String[] args) {
Person person = new Person();
person.name = "Bob";
modifyObject(person);
System.out.println(person.name); // ΠΡΠ²Π΅Π΄Π΅Ρ: Alice
}
}
πΉ ΠΠ΅ΡΠ΅Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ (Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ)
class Person {
String name;
}
public class Test {
public static void reassignReference(Person p) {
p = new Person(); // ΠΠ΅ΡΠ΅Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ)
p.name = "Charlie";
}
public static void main(String[] args) {
Person person = new Person();
person.name = "Bob";
reassignReference(person);
System.out.println(person.name); // ΠΡΠ²Π΅Π΄Π΅Ρ: Bob (Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ)
}
}
π₯ ΠΡΠΎΠ³
πΉ Java Π²ΡΠ΅Π³Π΄Π° ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ!
πΉ ΠΡΠΈΠΌΠΈΡΠΈΠ²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠΏΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ.
πΉ ΠΠ±ΡΠ΅ΠΊΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠΏΠΈΠΈ ΡΡΡΠ»ΠΎΠΊ, Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΎΡ
ΡΠ°Π½ΡΡΡΡΡ.
πΉ ΠΡΠ»ΠΈ Π²Π½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΌΡ ΡΡΡΠ»ΠΊΡ, ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
π² ΠΡ Π² MAX
π@BookJavasorted() ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅ ΠΈ ΡΠΈΡΠ°Π΅ΡΡΡ ΠΏΠΎΡΡΠΈ ΠΊΠ°ΠΊ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ·ΡΠΊ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠΌΠΏΠΎΡΡ.
π² ΠΡ Π² MAX
π@BookJavaGET /users/123 - ΠΠ°ΠΉ ΠΌΠ½Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ 123.
β’ POST /users - Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
β’ DELETE /users/123 - Π£Π΄Π°Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
β
ΠΠ»ΡΡΡ:
β’ ΠΡΠΎΡΡΠΎΡΠ°: ΠΠΎΠ½ΡΡΠ΅Π½ Π²ΡΠ΅ΠΌ, Π»Π΅Π³ΠΊΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· Postman ΠΈΠ»ΠΈ Π±ΡΠ°ΡΠ·Π΅Ρ.
β’ ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: ΠΠ΄Π΅Π°Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ CDN (ΠΎ ΠΊΠΎΡΠΎΡΡΡ
ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ ΡΠ°Π½ΡΡΠ΅), ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΡ HTTP.
β ΠΠΈΠ½ΡΡΡ:
β’ Over-fetching (ΠΠ·Π±ΡΡΠΎΡΠ½ΠΎΡΡΡ): ΠΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½ΠΎ ΠΌΠ΅ΡΠΎΠ΄ GET /users/1 Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΉ JSON Π½Π° 50 ΠΏΠΎΠ»Π΅ΠΉ (Ρ Π°Π΄ΡΠ΅ΡΠ°ΠΌΠΈ, Π΄Π°ΡΠ°ΠΌΠΈ ΠΈ Ρ.Π΄.). ΠΡ ΡΡΠ°ΡΠΈΡΠ΅ ΡΡΠ°ΡΠΈΠΊ Π²ΠΏΡΡΡΡΡ.
β’ Under-fetching (ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΡΡΡ) ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° N+1: Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π΅Π³ΠΎ 10 ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ
ΠΏΠΎΡΡΠΎΠ², ΡΡΠΎΠ½ΡΠ΅Π½Π΄Ρ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ 1 Π·Π°ΠΏΡΠΎΡ ΠΊ /users/1 ΠΈ Π΅ΡΠ΅ 10 Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ /posts?userId=1. ΠΡΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.
πΈοΈ 2. GraphQL (ΠΠ΅ΡΡΠ° Π€ΡΠΎΠ½ΡΠ΅Π½Π΄Π΅ΡΠ°)
Π Π°Π·ΡΠ°Π±ΠΎΡΠ°Π½ Π² Facebook Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ REST ΠΏΡΠΈ ΡΠ»Π°Π±ΠΎΠΌ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅.
Π‘ΡΡΡ: Π£ Π²Π°Ρ Π΅ΡΡΡ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ Endpoint (ΠΎΠ±ΡΡΠ½ΠΎ POST /graphql). ΠΠ»ΠΈΠ΅Π½Ρ ΡΠ°ΠΌ ΠΏΠΈΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡ-ΡΡ
Π΅ΠΌΡ, Π³Π΄Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΏΠΎΠ»Ρ Π΅ΠΌΡ Π½ΡΠΆΠ½Ρ.
ΠΠ°ΠΏΡΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°:
query {
user(id: "123") {
name
email
posts(last: 10) {
title
}
}
}
ΠΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°: ΠΠ΅ΡΠ½Π΅ΡΡΡ JSON ΡΡΡΠΎΠ³ΠΎ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ, email ΠΈ 10 Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΏΠΎΡΡΠΎΠ². ΠΠΈ ΠΎΠ΄Π½ΠΈΠΌ Π±Π°ΠΉΡΠΎΠΌ Π±ΠΎΠ»ΡΡΠ΅!
β
ΠΠ»ΡΡΡ:
β’ Π Π΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Over-fetching ΠΈ Under-fetching. ΠΠ΄ΠΈΠ½ Π·Π°ΠΏΡΠΎΡ = ΡΠΎΠ²Π½ΠΎ ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½Ρ Π΄Π»Ρ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΊΡΠ°Π½Π°.
β’ ΠΡΡΡΡΠ°Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π°: UI-ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΡ Π±ΡΠΊΠ΅Π½Π΄Π΅ΡΠΎΠ² Π½Π°ΠΏΠΈΡΠ°ΡΡ Π½ΠΎΠ²ΡΠΉ endpoint /users-with-posts-and-comments.
β ΠΠΈΠ½ΡΡΡ:
β’ Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ: Π’Π°ΠΊ ΠΊΠ°ΠΊ Π²ΡΡ ΠΈΠ΄Π΅Ρ ΡΠ΅ΡΠ΅Π· ΠΎΠ΄ΠΈΠ½ URL POST /graphql, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΊΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ Π½Π° ΡΡΠΎΠ²Π½Π΅ CDN (Cloudflare).
β’ Π£Π³ΡΠΎΠ·Π° Π΄Π»Ρ ΠΠ°Π·Ρ ΠΠ°Π½Π½ΡΡ
: ΠΡΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π°ΠΏΠΈΡΠ΅Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π³Π»ΡΠ±ΠΎΠΊΠΈΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ (ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ -> ΠΠΎΡΡΡ -> ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ -> ΠΠ²ΡΠΎΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² -> ΠΡ
ΠΏΠΎΡΡΡ), Π²Π°ΡΠ° ΠΠ ΠΏΡΠΎΡΡΠΎ "Π»ΡΠΆΠ΅Ρ".
π 3. gRPC (Π‘ΠΏΠΈΠ΄ΡΠ°Π½Π½Π΅Ρ Π΄Π»Ρ ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ²)
Π Π°Π·ΡΠ°Π±ΠΎΡΠ°Π½ Π² Google. ΠΡΠ»ΠΈ REST ΠΈ GraphQL ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΄ΠΎΠ±ΠΎΡΠΈΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° (JSON) ΠΏΠΎΠ²Π΅ΡΡ
ΡΡΠ°ΡΠΎΠ³ΠΎ HTTP/1.1, ΡΠΎ gRPC Π»ΠΎΠΌΠ°Π΅Ρ ΡΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°.
Π‘ΡΡΡ: ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΡΠ°ΠΊ, Π±ΡΠ΄ΡΠΎ ΠΎΠ½Π° Π»Π΅ΠΆΠΈΡ Π² Π²Π°ΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅.
ΠΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ HTTP/2 (ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΡΠΈΠΌΠΈΠ½Π³) ΠΈ Protobuf (Protocol Buffers).
Protobuf - ΡΡΠΎ Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ. ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΊΠ»ΡΡΠΈ "name": "Alex", ΠΎΠ½ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΠΏΡΠΎΡΡΠΎ Π±Π°ΠΉΡΡ ΠΏΠΎ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠ³ΠΎΠ²ΠΎΡΠ΅Π½Π½ΠΎΠΉ ΠΆΠ΅ΡΡΠΊΠΎΠΉ ΡΡ
Π΅ΠΌΠ΅ (.proto ΡΠ°ΠΉΠ»).
β
ΠΠ»ΡΡΡ:
β’ ΠΠ΅Π²Π΅ΡΠΎΡΡΠ½Π°Ρ ΡΠΊΠΎΡΠΎΡΡΡ: ΠΠΈΠ½Π°ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ Π²Π΅ΡΠΈΡ Π² ΡΠ°Π·Ρ ΠΌΠ΅Π½ΡΡΠ΅ JSON ΠΈ ΠΏΠ°ΡΡΠΈΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ. gRPC ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄ΠΎ 10 ΡΠ°Π· Π±ΡΡΡΡΠ΅Π΅ REST.
β’ Π‘ΡΡΠΎΠ³Π°Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ: ΠΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡ Π² .proto ΡΠ°ΠΉΠ»Π΅, ΠΈ ΠΈΠ· Π½Π΅Π³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠΎΠ΄ ΠΈ Π΄Π»Ρ Java-Π±ΡΠΊΠ΅Π½Π΄Π°, ΠΈ Π΄Π»Ρ Python-ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠΈΠΊΠ°ΠΊΠΈΡ
ΠΎΡΠΈΠ±ΠΎΠΊ "ΠΎΠΆΠΈΠ΄Π°Π» ΡΡΡΠΎΠΊΡ, ΠΏΡΠΈΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ".
β’ Π‘ΡΡΠΈΠΌΠΈΠ½Π³: ΠΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎ Π»ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΎΠ±Π΅ ΡΡΠΎΡΠΎΠ½Ρ.
β ΠΠΈΠ½ΡΡΡ:
β’ ΠΠ΅ ΡΠΈΡΠ°Π΅ΡΡΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ: ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΊΡΡΡΡ ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ payload, ΡΠ°ΠΌ Π±ΡΠ΄ΡΡ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΡΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ.
β’ ΠΠ»ΠΎΡ
Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π±ΡΠ°ΡΠ·Π΅ΡΠ°ΠΌΠΈ: ΠΠ°ΠΏΡΡΠΌΡΡ ΠΈΠ· JavaScript Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ gRPC Π²ΡΠ·Π²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎ (Π½ΡΠΆΠ΅Π½ ΠΏΡΠΎΠΊΡΠΈ grpc-web), ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π° Π΅Π³ΠΎ ΠΏΠΎΡΡΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ.
Π ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ΅:
ΠΠΎΠ±ΠΈΠ»ΠΊΠ° ΠΎΠ±ΡΠ°Π΅ΡΡΡ Ρ API Gateway ΠΏΠΎ GraphQL β> Gateway ΠΎΠ±ΡΠ°Π΅ΡΡΡ Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΌΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ ΠΏΠΎ gRPC.
#SystemDesign #API #REST #GraphQL #gRPC #Java
π² ΠΡ Π² MAX
π@BookJava