Java Portal | Программирование – Telegram
Java Portal | Программирование
12.8K subscribers
1.22K photos
103 videos
37 files
1.17K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
HTTP/2 через TCP против HTTP/3 через QUIC

▪️HTTP/2

Мультиплексирование на уровне HTTP, сериализация на уровне TCP
Общий порядок доставки и контроль перегрузки (TCP)

Одна TCP-сессия

HTTP/2 фреймы (мультиплексированные)

* HEADERS (поток 1)
* HEADERS (поток 3)
* HEADERS (поток 2)
* DATA (поток 1)
* DATA (поток 3)
* DATA (поток 2)

TCP-пакеты: P1, P2, P3, P4, P5

TCP-пакеты смешивают данные из разных потоков
HoL-блокировка в TCP (Head-of-Line): потеря одного пакета блокирует все потоки

Клиент -> Сервер


▪️HTTP/3

Мультиплексирование на транспортном уровне (QUIC)

* Независимые потоки
* Независимый порядок доставки и восстановление

QUIC-соединение (поверх UDP)
QUIC Stream 1: QUIC Packet, QUIC Packet, QUIC Packet
QUIC Stream 2: QUIC Packet, QUIC Packet
QUIC Stream 3: QUIC Packet, QUIC Packet

Нет HoL-блокировки: потеря пакета влияет только на один поток

Клиент -> Сервер


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Java tip: для точных расчетов времени используй Duration и Instant.

Instant представляет конкретный момент времени в UTC с точностью до наносекунд. Получить можно так: Instant.now().

Duration показывает временной интервал между двумя Instant (в секундах, миллисекундах, наносекундах).

Вот пример:

Instant start = Instant.now();
...
Instant end = Instant.now();

Duration elapsed = Duration.between(start, end);


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Изучение Spring Boot у новичков часто вызывает перегруз 😵‍💫

Поэтому автор сделал Spring Boot Self Learning Guide: короткий гайд с упором на примеры, который покрывает самые часто используемые фичи Spring Boot.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍96🔥4🌚1
Java: с CompletableFuture.allOf(...) можно дождаться завершения сразу нескольких асинхронных задач, без ручной возни с join() по каждой.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Осознанная стоимость абстракций: Autoboxing в современной Java

Мы живём во времена, когда на оперативной памяти для heap Java-приложений почти не экономят, а архитектурные решения, которые ещё недавно можно было назвать расточительными, всё чаще воспринимаются как best practices.

Но не все коту масленица. Благодаря AI-буму, облачным вычислениям и микросервисной архитектуре с сотнями одновременно работающих инстансов, мы можем воочию наблюдать неукротимый рост стоимости оперативной памяти, что обязывает вернуться к рассмотрению принципов её экономии.

В этих условиях привычные абстракции требуют переоценки.

Сегодня я хочу напомнить об одной из самых распространенных в Java — autoboxing — механизме автоматической упаковки примитивных типов в соответствующие объекты-обертки.

Приглашаю вас посмотреть на знакомый Java-код не глазами разработчика, а глазами JVM, сборщика мусора и процессора, и разобраться, как незаметные на уровне синтаксиса решения превращаются в аллокации, давление на GC и раздувание heap.


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Совет по Java: используйте List.copyOf(list), чтобы сделать безопасную, неизменяемую копию и избежать случайных изменений.

// До Java 10, чтобы получить независимую неизменяемую копию, приходилось писать так:
List<String> copy = Collections.unmodifiableList(new ArrayList<>(originalList));

// Начиная с Java 10 это можно сделать короче:
List<String> copy = List.copyOf(originalList);

// Любая попытка добавить/удалить элемент выбросит UnsupportedOperationException:
List<String> original = new ArrayList<>();
original.add("A");
original.add("B");
List<String> copy = List.copyOf(original);
copy.add("C"); // UnsupportedOperationException


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍4
В Spring Boot лучше заменять @Value на @ConfigurationProperties, если хочешь больше контроля и нормальную тестируемость.

▪️Когда ты используешь @Value для кучи параметров, конфиг расползается по проекту: настройки оказываются разбросаны по разным классам, их сложнее поддерживать и тестировать.
▪️@ConfigurationProperties собирает связанные параметры в один класс, позволяет навесить валидацию и делает структуру кода аккуратнее.

Разница по сути такая:

▪️С @Value это строковая инъекция свойств без валидации.
▪️С @ConfigurationProperties это type-safe конфиг с возможностью валидации.

Плюсы:

▪️автокомплит в IDE
▪️валидация
▪️проще тестировать
▪️чище структура кода

В тестах можно просто замокать объект с настройками, вместо того чтобы возиться с отдельными @Value аннотациями на каждом поле.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍72
Java-совет: начиная с Java 8 можно использовать ChronoUnit.between(start, end), чтобы посчитать интервал времени в конкретной единице (дни, часы, минуты) без ручных вычислений.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍7
Хороший блог/ресурс по структуре данных Graph

Вчера, когда я снова разбирал задачи на графы, я наткнулся на этот блог в разделе Discussions на LeetCode.

Ссылка: гугл док

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java: начиная с Java 12, можно использовать String.indent(n), чтобы форматировать многострочные строки, добавляя отступ.

n > 0: добавляет n пробелов в начале каждой строки.

n < 0: убирает до n ведущих пробелов (пробелов в начале) из каждой строки.

Добавление пробелов:

String text = "Text\ncontent";
System.out.println(text.indent(0));
System.out.println(text.indent(4));
System.out.println(text.indent(0));

Удаление пробелов:

String text = " Text\n content";
System.out.println(text.indent(-4));


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42
Как и зачем писать свой DatabaseDialect для Kafka JDBC Sink

Я активно использую на проекте Kafka Connect Framework и в частности Kafka JDBC Sink Connector для быстрого сохранения данных из Kafka Topic в БД PostgresSQL. Для большинства задач достаточно написать простую JSON-конфигурацию и все стабильно и быстро работает из коробки. Нет необходимости в написании собственного кода. Однако в нетиповых ситуациях расширяемость Kafka Connect тоже помогает - можно переопределить и написать один из компонентов.

В конфигурации JDBC Sink Connector Task существует настройка dialect.name, которая отвечает за выбор диалекта для работы с конкретной БД. Как правило, в 99% случаев используется один из уже реализованных для популярных БД диалектов, как например в моем случае PostgresSqlDatabaseDialect для PostgreSQL.

Может показаться, что вряд ли кому-то понадобится реализовывать свой диалект, если только не имеем дело с какой-то специфичной непопулярной БД. Однако на практике оказалось, что реализация своего диалекта даже для PostgreSQL может быть полезна для решения некоторых возникающих прикладных задач.


В данной статье автор хочет показать идеи того, как реализация своего DatabaseDialect может помочь при имплементации нестандартных сценариев для вполне себе популярной БД Postgres, для которой существует PostgresSqlDatabaseDialect.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: ты можешь валидировать входные DTO через @Valid плюс аннотации вроде @NotBlank, @Email и т.д.

public class RegistrationRequest {

@Email(message = "Please provide a valid email address")
@NotBlank(message = "Email is required")
private String email;

@Size(min = 8, max = 16, message = "Password must be 8–16 characters long")
private String password;

@Pattern(
regexp = "^[0-9]{10,15}$",
message = "Phone number must be 10–15 digits"
)
private String phone;

// getters & setters
}


By Default, if the validation fails Spring automatically returns a 400 Bad Request with a detailed error body like:


{
"timestamp": "2025-01-01T12:00:00Z",
"status": 400,
"errors": [
"Email is required",
"Age must be at least 18"
]
}


You can customize the response by implementing a global exception handler


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52
Аннотации Spring Boot, которые нужно знать

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
8