bookjava | Unsorted

Telegram-канал bookjava - Библиотека Java разработчика

10986

📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP

Subscribe to a channel

Библиотека Java разработчика

Если вы пишете бэкенд на Java и хотите работать на уровне серьёзных проектов, тестирование в Spring — навык, без которого сейчас никуда.

На открытом уроке «Тестирование Spring-приложений. Интеграционные тесты с контекстом» вы разберётесь, как правильно тестировать репозитории (JDBC и JPA) и сервисы с учётом транзакций. Это ключ к тому, чтобы ваш код был не только рабочим, но и надёжным в реальных продакшн-системах.

Вы получите пошаговый разбор особенностей интеграционного тестирования и научитесь писать простые тесты для репозиториев и сервисов. Эти знания напрямую повысят вашу ценность на рынке как Java-разработчика.

Урок проходит в преддверие старта курса «Разработчик на Spring Framework», все участники получат скидку на обучение: https://vk.cc/cP0uOe

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

Spring Boot 4 и Spring Framework 7: Ключевые фичи и изменения

Уже в ноябре 2025 выходит Spring Boot 4 — масштабный релиз, построенный на фундаменте Spring Framework 7.0.0 и Jakarta EE 11. Это не просто очередное обновление, а важный этап в развитии всей Java-платформы: новые возможности для REST и безопасности, улучшенная работа с Kotlin и GraalVM, мощная поддержка облаков и нативных образов, а также инструменты для создания отказоустойчивых приложений.

https://loiane.com/2025/08/spring-boot-4-spring-framework-7-key-features/

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Сравнение через equals() и ==

▪️ "==" используется для сравнения примитивных типов данных (например, int, char, boolean), проверяя, равны ли их значения. Однако, когда речь идет об объектах, "==" сравнивает их ссылки, то есть проверяет, указывают ли обе переменные на один и тот же объект в памяти.

▪️ Метод equals(), в свою очередь, предназначен для сравнения содержимого объектов. Это значит, что equals() проверяет, эквивалентны ли сами данные, хранящиеся в двух объектах, а не то, ссылаются ли они на одно и то же место в памяти.

Используйте == для сравнения примитивов и ссылок на объекты, когда вам важно знать, являются ли они одной и той же сущностью. Для сравнения содержимого объектов всегда применяйте equals().

👉@BookJava

Читать полностью…

Библиотека Java разработчика

💡Big Data — это не только модный термин, а фундамент современной аналитики и AI. Apache Spark — инструмент, который используют крупнейшие компании по всему миру. Хотите понять, как он работает, и применить его в своей практике?

28 августа в 18:00 мы проведем открытый вебинар «Практическое введение в Apache Spark». За 1,5 часа вы узнаете, зачем нужен Spark, как разворачивать тестовую среду в Docker, работать с DataFrame API и Spark SQL, оптимизировать запросы и избегать типичных ошибок.

Вместе разберем реальный кейс на небольшом датасете и вы увидите, что обработка больших данных может быть быстрой и удобной.

➡️ Открытый урок проходит в преддверии старта курса «Spark Developer», все участники получат скидку на обучение. Регистрируйтесь прямо сейчас: https://vk.cc/cOWWa2

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

«Apache Kafka» от OTUS — это повышение квалификации для тех, кто хочет обрабатывать потоки данных быстро и без сбоев.

Живые лекции от инженеров-практиков, актуальные технологии Kafka Streams, Spring, ZIO и ksqlDB, много практики и востребованный диплом.

Вы научитесь разворачивать Kafka, интегрировать технологии с другими сервисами и строить систему мониторинга.

Проверьте, готовы ли вы к погружению в мир Kafka. Пройдите короткий вступительный тест и получите скидку на обучение: https://vk.cc/cOUhq7

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Читать полностью…

Библиотека Java разработчика

Совет💡

Будьте осторожны при использовании @AllArgsConstructor от Lombok. Для генерации конструктора он использует порядок полей в классе. Если поля имеют одинаковый тип и вы переставите их местами, то начнете писать в разные поля, и компилятор не сможет помочь.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Совет по Java💡

show-sql - это самый простой (но не самый лучший!) способ увидеть SQL, сгенерированный Hibernate. Вы можете немного улучшить его, включив форматирование, показ JPQL-запроса, сгенерировавшего запрос, и включив подсветку, которая добавляет некоторый цвет к выводу.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

REST или GraphQL? Этот выбор может определить, насколько удобным, быстрым и масштабируемым будет ваш API.

26 августа в 20:00 на открытом уроке мы разберём, когда стоит выбрать REST, а когда — GraphQL, а также реализуем оба подхода в Spring Boot. Эксперт покажет критерии выбора, разберёт практические кейсы и типичные ошибки.

Backend-разработчики на Java/Kotlin и тимлиды узнают, как применять эти технологии на практике, чтобы их проекты работали быстрее, были проще в сопровождении и готовыми к росту.

Вебинар проходит в преддверие старта курса «Разработчик на Spring Framework».

Регистрируйтесь сейчас и получите скидку на обучение: https://vk.cc/cOMqtr

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

Где у Java приложения точка входа?

В обычном Java приложении всегда должен быть main class, содержащий метод main. С него начинается исполнение всей программы. Main class-ом может быть не только класс, но и интерфейс или енам. Для JavaFX приложения главный класс должен реализовывать javafx.application.Application.

main обязательно public static. Дополнительно, методу разрешено иметь модификатор strictfp. На аннотации и список исключений ограничений не накладывается.

В главном методе должен быть объявлен единственный аргумент – массив строк. Обе конструкции String[] и String... компилируются в один и тот же байт-код, так что приемлемы оба варианта. Название массива может быть любым, а значение будет содержать аргументы командной строки.

Когда приложение запускается как classpath, главный класс передается параметром командной строки. Если выполняется единственный исходник, он и описывает main class.

Для исполняемого jar-файла (java -jar MyJar.jar), его главный класс должен быть указан в манифесте. Внутри архива, в файл META-INF/MANIFEST.MF добавляется строчка вида Main-Class: ru.google.com.MyClass. Иначе запуск завершается ошибкой «no main manifest attribute».

В случае, когда в указанном главном классе не оказывается метода, который бы удовлетворял всем критериям главного метода, программа падает с ошибкой «Main method not found».

В апплетах вместо main входной точкой служат методы init и start. Начиная с версии Java 9 технология апплетов объявлена устаревшей, а с 11 – совсем удалена. Не будем останавливаться на них подробнее.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Java. Проблема с null. Null safety

В этом видео я рассказываю о проблеме с null в языке программирования Java, из-за которой возникает печально известное NullPointerExeption. Даю некоторые рекомендации по организации кода для борьбы с этой проблемой и повышения надежности работы программ.

источник

👉@BookJava

Читать полностью…

Библиотека Java разработчика

👩‍💻 Открытый урок «Лучшие практики Kafka и Schema Registry в backend-разработке на Java».

Kafka уже стала стандартом для высоконагруженных систем, а Schema Registry — ключом к надёжной работе с данными.
Хотите уверенно интегрировать их в свои Java-проекты?

Приглашаем на открытый урок

🗓 26 августа в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».

🎯 О чём поговорим:
✔️ Разработка Kafka-продюсеров и консьюмеров на Java: шаблоны и анти-паттерны.
✔️ Работа со схемами данных: Avro, JSON-schema и интеграция со Schema Registry.
✔️ Управление версиями схем: совместимость, миграции и депрецирование.
✔️ Производительность и отказоустойчивость: настройки партиционирования, ретеншна и репликации.
✔️ Безопасность и мониторинг: аутентификация, авторизация и метрики Kafka.

👥 Кому будет интересно:
Java-разработчикам и архитектам, работающим с распределёнными системами, а также DevOps-инженерам, внедряющим Kafka в продакшен.

💡В результате урока вы:
— Освоите ключевые подходы к созданию надёжных Kafka-приложений на Java.
— Научитесь эффективно управлять схемами данных в Schema Registry и оптимизировать производительность ваших систем.

🎁 Дарим промокод, который дает скидку на обучение - JAVA_09

🔗 Ссылка на регистрацию: https://vk.cc/cOK2dx

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

🔍 Завтра тестовое собеседование с Java-разработчиком

20 августа (уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Сергею

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир
→ @shortcut_sh_bot

Реклама.
О рекламодателе.

Читать полностью…

Библиотека Java разработчика

Sealed Classes.

Sealed Classes — контроль наследования в Java 🔒

Одна из самых недооценённых фич Java 17 — sealed классы.
Если коротко: теперь ты можешь жёстко контролировать, кто именно может наследоваться от твоего класса.

До Java 17 🤯

Представь, у тебя есть базовый класс:


abstract class Shape {}


И куча наследников кто во что горазд:
Circle, Rectangle, Triangle, StarShape, ShapeFromLegacyLib...
А потом в коде появляются неожиданные "левые" реализации, и поддержка превращается в ад.


В Java 17 пришло спасение 🦸


public sealed abstract class Shape
permits Circle, Rectangle, Triangle {}


Теперь только указанные классы могут наследовать Shape.
Больше никаких сюрпризов из сторонних либ или неосторожных рук джуна.


Варианты модификаторов 🛠️

У наследников есть три опции:

1. final — дальше наследовать нельзя.


public final class Circle extends Shape {}


2. sealed — продолжаем ограничивать список наследников.


public sealed class Rectangle extends Shape
permits Square {}


3. non-sealed — снимаем ограничения, и от этого класса можно наследоваться свободно.


public non-sealed class Triangle extends Shape {}



Зачем это вообще? 🤔

✅ Чёткий контроль иерархии (никакой анархии).
✅ Более безопасный switch с pattern matching: компилятор проверяет, что ты обработал все варианты.
✅ Понятный контракт: сразу видно, какие подтипы есть.


Пример использования с switch 💡


static String print(Shape shape) {
return switch (shape) {
case Circle c -> "Круг";
case Rectangle r -> "Прямоугольник";
case Triangle t -> "Треугольник";
};
}


И всё!
Если ты забыл какой-то подтип, компилятор не даст собрать проект 🚨.


Итог ⚡️

- Sealed Classes = контроль + безопасность + читаемость.
- В паре с Pattern Matching в switch это превращается в почти алгебраические типы данных (как в Kotlin или Scala).
- Если у тебя чётко ограниченный набор сущностей — sealed классы must-have.

👉 @BookJava

Читать полностью…

Библиотека Java разработчика

Pattern Matching в switch.

Pattern Matching в switch — убийца if-else цепочек ⚔️

Ты наверняка видел такие простыни:


if (obj instanceof String) {
System.out.println("Строка длиной " + ((String) obj).length());
} else if (obj instanceof Integer) {
System.out.println("Целое число " + obj);
} else if (obj instanceof List) {
System.out.println("Список размером " + ((List<?>) obj).size());
} else {
System.out.println("Неизвестный тип");
}


Знакомо? 😅
Тут и дублирование, и касты, и вечная путаница.


Что пришло с Java 17+ 🌟

Теперь можно использовать Pattern Matching прямо в switch:


switch (obj) {
case String s -> System.out.println("Строка длиной " + s.length());
case Integer i -> System.out.println("Целое число " + i);
case List<?> l -> System.out.println("Список размером " + l.size());
default -> System.out.println("Неизвестный тип");
}


Красота:

✅ Нет ручных кастов
✅ Нет else if простыней
✅ Всё читается как декларативное описание

А если хочется добавить условия? 🤔

Можно так:


switch (obj) {
case String s when s.length() > 5 ->
System.out.println("Длинная строка");
case String s ->
System.out.println("Короткая строка");
default ->
System.out.println("Что-то другое");
}


Тут when — это guard condition.
Оно проверяется после совпадения типа, и только тогда срабатывает ветка.


Сравним 🥊

До Java 17: каша из if-else, ручные касты.
После Java 17: один чистый switch, никакой боли.

Итог 💡

- Используй switch с pattern matching, когда у тебя много разных подтипов или вход может быть разным типом.
- Код становится декларативным и компактным.
- А главное — исчезают дубли и лишние касты.

👉 @BookJava

Читать полностью…

Библиотека Java разработчика

⚙️ Микросервисы начинают тормозить под нагрузкой?

💡 Узнайте, как масштабировать и оптимизировать систему с помощью CQRS и Event Sourcing на .NET Aspire.

На открытом вебинаре «Оптимизация микросервисов с CQRS и Event Sourcing на .NET Aspire» 19 августа в 20:00 МСК разберем:
◽️ Ограничения классических микросервисов при высокой нагрузке.
◽️ Принципы разделения команд и запросов (CQRS) и хранения истории через Event Sourcing.
◽️ Практическую реализацию: сервис заказов с «команда-обработчик» и хранением событий в MongoDB.
◽️ Конфигурацию проекций для чтения данных.

❗️ Вы освоите оркестрацию через .NET Aspire (API Gateway, Order Service, база событий), внедрите логирование и трейсинг через OpenTelemetry, а также протестируете создание заказа, обновление статуса и визуализацию потока событий.

➡️ Посетите открытый урок и получите скидку на большое обучение «C# ASP.NET Core разработчик»: https://vk.cc/cOz6s4

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Читать полностью…

Библиотека Java разработчика

«За пределами REST: использование full-stack сигналов для реактивных интерфейсов в реальном времени» — Лейф Острэнд @ Spring I/O 2025

Современному веб-приложению нужно больше, чем просто запрашивать JSON с сервера и отправлять обратно значения форм в виде JSON. Пользователи ожидают не просто ещё один CRUD-интерфейс на REST. Они ждут обновлений в реальном времени, офлайн-синхронизации и бесшовного опыта на разных устройствах. Достичь этого, опираясь только на низкоуровневые соглашения вроде REST и WebSockets, требует огромных усилий.

Многие UI-фреймворки внедрили концепцию «сигналов», чтобы упростить обновление разных частей интерфейса при изменении состояния. Тот же подход можно применить и через сеть как full-stack-решение — для простого обновления интерфейсов сразу у нескольких пользователей, работающих с общим состоянием.

В этом практическом докладе будет показано, как использовать концепцию full-stack-сигналов для простой синхронизации данных приложения между пользователями на всём уровне стека — от UI до базы данных. Вы узнаете, как создавать приложения, которые по-настоящему радуют ваших пользователей.

источник

👉@BookJava

Читать полностью…

Библиотека Java разработчика

👩‍💻 Разработка на Java требует глубокого понимания не только языка, но и принципов работы JVM, многопоточности и современных фреймворков.

🎯 Курс «Java Developer. Professional» — это структурированное обучение для разработчиков, которые хотят выйти на новый уровень, освоить актуальный стек технологий и уверенно претендовать на позиции уровня Middle+.

Вы получите 96 часов практической работы, на живых вебинарах разберете ключевые аспекты работы JVM, научитесь строить эффективные многопоточные приложения, освоите Spring WebFlux, Kafka, реактивный Postgres и Kubernetes.

📚Программа OTUS постоянно обновляется, соответствуя требованиям рынка, а диплом ценится работодателями.

🎁 Дарим промокод, который дает скидку на обучение - JAVA_09

➡️ Пройдите вступительное тестирование и присоединяйтесь к группе: https://vk.cc/cOY43c

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

И опыт, сын ошибок трудных: обрабатываем ошибки в Spring Boot

Долгое время разрабатывая микросервисы в разных командах, я сталкивался с типовой задачей: созданием максимально информативного ответа на запрос, когда произошла какая-то ошибка. Особенно это актуально для систем с пользовательским фронтендом, большим количеством интеграций или систем, которые представляют свой API как продукт. Во многих случаях это решалось выдачей сообщения «Ошибка системы» с HTTP-кодом 500. Из раза в раз меня не покидало ощущение, что решению этой задачи не уделяется должного внимания и времени. В текущем проекте нам пришлось пройти все круги ада, изменить несколько подходов и реализаций. И здесь я постарался описать, как это было, и сформулировать выводы, которые мы сделали на каждом шаге решения проблемы.

https://habr.com/ru/companies/T1Holding/articles/834288/

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Spring Boot Tutorial | Полный курс

В этом учебном пособии по Spring Boot рассказывается о том, как начать работу с Spring Boot и Java.

00:00 Intro
01:00 Quick Word
02:12 Spring Boot Overview
03:44 Project Overview
04:28 Spring Initializr
08:05 IntelliJ
10:29 Starting The Server
14:03 Simple API with Spring Boot
18:06 Student Class
23:19 API Layer
26:38 Business Layer
29:08 Dependency Injection
32:47 Properties file
36:15 Creating and Connecting to Database
39:48 JPA and @ Entity
42:35 JPA in Action
45:52 Amigoscode Database Courses
47:35 JPA Repository
52:20 Saving Students
58:49 @ Transient
01:03:01 Post Mapping
01:08:00 Writing Business Logic
01:12:43 Testing Post Request
01:15:35 Deleting Students
01:21:33 Exercise
01:22:53 Solution
01:26:54 Testing
01:29:41 Packaging and Running Application
01:34:52 Next steps

источник

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Java. Быстрая сортировка. Реализация алгоритма QuickSort.

Как работает быстрая сортировка, разбор и реализация алгоритма.

источник

👉@BookJava

Читать полностью…

Библиотека Java разработчика

🙌🏼 Привет, на связи команда MWS Cloud Platform!

Приезжаем в Казань и будем рады вас видеть на нашем митапе о Java/Kotlin 30 сентября в пространстве MEDIAPORT. Соберёмся обсудить подходы, которые мы используем при строительстве облака, а ещё привезём с собой жаркую дискуссию о будущем Java и Go в энтерпрайзе.

⚡️Мероприятие бесплатное, но количество мест ограничено, поэтому регистрация обязательна.

📋Что в программе:
— Интеграция IAM и Compute в MWS Cloud Platform
— Облачный сетевой балансировщик нагрузки своими руками
— Java vs Go: будущее энтерпрайза под вопросом

⚡️После докладов будем знакомиться и общаться в неформальной обстановке с закусками и напитками. Приходите узнать новое, увидеться с коллегами и техническим сообществом Казани!

До встречи на митапе,
команда MWS Cloud Platform

Читать полностью…

Библиотека Java разработчика

Подборка из 10 репозиториев GitHub для изучения Java

1. Awesome Java: https://github.com/akullpp/awesome-java
2. Modern Java - A Guide to Java 8: https://github.com/winterbe/java8-tutorial
3. Java Design Patterns: https://github.com/iluwatar/java-design-patterns
4. Spring Framework: https://github.com/spring-projects/spring-framework
5. Algorithms: https://github.com/TheAlgorithms/Java
6. Spring Boot Tutorial: https://github.com/RameshMF/spring-boot-tutorial
7. Baeldung Java and Spring Tutorials: https://github.com/eugenp/tutorials
8. Google Style Guides: https://github.com/google/styleguide
9. Netflix - Open Source Java Projects: https://github.com/Netflix
10. Ultimate Java Resources: https://github.com/dubesar/Ultimate-Java-Resources

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Что такое «лямбда»? Какова структура и особенности использования лямбда-выражения?

Лямбда представляет собой набор инструкций, которые можно выделить в отдельную переменную и затем многократно вызвать в различных местах программы.

Основу лямбда-выражения составляет лямбда-оператор, который представляет стрелку ->. Этот оператор разделяет лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая собственно представляет тело лямбда-выражения, где выполняются все действия.

Лямбда-выражение не выполняется само по себе, а образует реализацию метода, определенного в функциональном интерфейсе. При этом важно, что функциональный интерфейс должен содержать только один единственный метод без реализации.

interface Operationable {
int calculate(int x, int y);
}

public static void main(String[] args) {
Operationable operation = (x, y) -> x + y;
int result = operation.calculate(10, 20);
System.out.println(result); //30
}

По факту лямбда-выражения являются в некотором роде сокращенной формой внутренних анонимных классов, которые ранее применялись в Java.

Отложенное выполнение (deferred execution) лямбда-выражения- определяется один раз в одном месте программы, вызываются при необходимости, любое количество раз и в произвольном месте программы.

Параметры лямбда-выражения должны соответствовать по типу параметрам метода функционального интерфейса:

operation = (int x, int y) -> x + y;
//При написании самого лямбда-выражения тип параметров разрешается не указывать:
(x, y) -> x + y;
//Если метод не принимает никаких параметров, то пишутся пустые скобки, например:
() -> 30 + 20;
//Если метод принимает только один параметр, то скобки можно опустить:
n -> n * n;


Конечные лямбда-выражения не обязаны возвращать какое-либо значение.

interface Printable {
void print(String s);
}

public static void main(String[] args) {
Printable printer = s -> System.out.println(s);
printer.print("Hello, world");
}

Блочные лямбда-выражения обрамляются фигурными скобками. В блочных лямбда-выражениях можно использовать внутренние вложенные блоки, циклы, конструкции if, switch, создавать переменные и т.д. Если блочное лямбда-выражение должно возвращать значение, то явным образом применяется оператор return:

Operationable operation = (int x, int y) -> {
if (y == 0) {
return 0;
}
else {
return x / y;
}
};


Передача лямбда-выражения в качестве параметра метода:

interface Condition {
boolean isAppropriate(int n);
}

private static int sum(int[] numbers, Condition condition) {
int result = 0;
for (int i : numbers) {
if (condition.isAppropriate(i)) {
result += i;
}
}
return result;
}

public static void main(String[] args) {
System.out.println(sum(new int[] {0, 1, 0, 3, 0, 5, 0, 7, 0, 9}, (n) -> n != 0));
}


👉@BookJava

Читать полностью…

Библиотека Java разработчика

🏗 Курс “Software Architect” от OTUS — старт набора в группу обучения

Если хотите проектировать отказоустойчивые и масштабируемые системы — этот курс для вас!


Почему стоит пойти:

• 100% практики на реальных проектах
• Проектирование гибких архитектур
• Микросервисы, интеграции, Big Data
• Современные паттерны: CQRS, Event Sourcing и др.

💡 Кому подойдёт:
• Разработчикам, готовым выйти на новый уровень
• Архитекторам, углубляющим экспертизу
• Тимлидам и менеджерам

После курса вы сможете:

• Проектировать масштабируемые архитектуры
• Оптимизировать взаимодействие сервисов
• Повышать качество и устойчивость систем

👉 Пройдите вступительное тестирование: https://vk.cc/cOLiuq

Читать полностью…

Библиотека Java разработчика

Совет по Java💡

При использовании Projections и QueryDSL, вместо того чтобы использовать Projections.constructor(Class type, Expression ...), можно добиться большей типобезопасности, применяя аннотации @QueryProjection и @QueryEntity. Таким образом, для вашей проекции будет сгенерирован типобезопасный QClass.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Как выполнять итерацию по коллекции в Java?

Коллекция в Java — это объект, который группирует несколько элементов в единое целое и является частью Java Collections Framework. Она часто используется для хранения, извлечения, обработки и передачи агрегированных данных.

Чтобы пройтись по коллекции, можно использовать цикл for-each, итератор или традиционный цикл for. Пример ниже показывает использование for-each и обычного цикла for:


// Example using for-each loop:
List<String> fruits = Arrays.asList("Apple", "Banana", "Orange");
for (String fruit : fruits) {
System.out.println(fruit);
}
// Example using regular for loop:
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}


👉 @BookJava

Читать полностью…

Библиотека Java разработчика

Парсинг на Java. От основ до парсинга Яндекс Карт

Сегодня я рассмотрю основы парсинга на Java, используя как пример Яндекс Карты.

В этой статье мы рассмотрим, что такое HTTP и какие бывают методы запроса, как работать с HttpClient в Java 11+, как отправлять GET и POST-запросы, как обрабатывать HTTP-ответы и извлекать данные, и как всё это можно использовать для парсинга данных с внешнего сервера на примере Яндекс Карт.

https://habr.com/ru/companies/amvera/articles/937894/

👉 @BookJava

Читать полностью…

Библиотека Java разработчика

🔧 Сложности с масштабированием консьюмеров в RabbitMQ? Узнайте, как избежать ошибок, которые могут привести к потерям в порядке обработки сообщений.

📅 На открытом уроке 21 августа в 20:00 МСК разберём реальные кейсы и покажем, как правильно масштабировать консьюмеры, сохраняя порядок обработки. Узнаете, какие проблемы могут возникнуть при некорректном масштабировании и как их решить.

🎯 Получите ценные знания по прогнозированию и устранению проблем, повысите производительность системы и избегайте критических ошибок.

🚀 Зарегистрируйтесь на вебинар и получите в подарок записи трёх уроков по «Symfony», а также скидку на полный курс «Symfony Framework». Подарки доступны всем участникам! Регистрация по ссылке:

https://vk.cc/cOFmfT

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Читать полностью…

Библиотека Java разработчика

Когда лучше использовать record, а когда class в Java.

Record vs Class в Java ☕️📦

С 2021-го в Java появилась новая зверушка - record.
Сначала все радовались: "О, меньше кода, equals/hashCode/constructor сами пишутся!" 🎉
А потом пошли странные вопросы в код-ревью:

"А почему у тебя тут record, а не class?"
"record же immutable, а ты тут мутируешь поле через рефлексию, ты что…"


Разберёмся, когда record - подарок, а когда - мина замедленного действия.


Немного теории 📚

record в Java — это особый вид final-класса с:

- Автоматическим конструктором по всем полям.
- equals, hashCode и toString из коробки.
- Неизменяемыми (final) полями.
- Неявным private final для каждого компонента.

Это всё звучит прекрасно, но у этого есть архитектурные последствия.


Когда record - лучший выбор ✅

1. DTO / данные без логики
Когда объект нужен просто как "контейнер" для данных, особенно при обмене между сервисами.


public record UserDto(String name, int age) {}


2. Иммутабельные объекты
Нет сеттеров, нет сюрпризов. Многопоточка будет тебе благодарна ❤️.

3. Модели конфигураций
Конфиг парсится один раз — и потом спокойно читается везде.

4. Key-объекты для Map/Set
Так как equals и hashCode генерятся честно и по всем полям - отличная стабильная ключевая структура.


Когда class лучше 🚫

1. Сложная логика внутри
Если объект должен уметь менять своё состояние, record тебе мешает: поля final, сеттеров нет.

2. Наследование
Record - всегда final. Забудь про расширение.

3. ORM (например, Hibernate)
Многие ORM любят пустые конструкторы и сеттеры. С record они просто не подружатся (даже если будут пытаться через магию).

4. Сериализация с изменениями
Если JSON-модель в будущем изменится, record будет ломаться при парсинге, потому что конструктор фиксирован.


Хитрости и подводные камни ⚠️

- Можно добавлять методы в record.


public record Point(int x, int y) {
public double length() {
return Math.sqrt(x*x + y*y);
}
}

- Поля можно менять через рефлексию (но не надо — это ломает смысл record).
- Не стоит превращать record в «богатый объект» с кучей логики — это будет запутывать.


Итог 💡

- Берём record, когда нужна простая, иммутабельная структура данных без лишней логики.
- Берём class, когда есть сложное поведение, наследование, интеграция с фреймворками вроде Hibernate.

record - это не замена class, а инструмент для конкретных задач.
А вот если ты пишешь DTO и у тебя до сих пор class с геттерами/сеттерами, то, возможно, ты застрял в 2010-м 😏.

👉 @BookJava

Читать полностью…

Библиотека Java разработчика

В чем разница между перегрузкой метода и переопределением метода в Java?

🧠 Перегрузка метода (Method Overloading)
Это когда в одном классе есть методы с одинаковым именем, но разными сигнатурами (количеством или типами параметров).

* Компилятор выбирает метод на этапе compile-time.
* Можно менять:

* количество параметров
* тип параметров
* порядок параметров
* Нельзя перегружать метод, меняя только возвращаемый тип.

💡 Пример:


public class MathUtil {
public int sum(int a, int b) { return a + b; }
public double sum(double a, double b) { return a + b; }
public int sum(int a, int b, int c) { return a + b + c; }
}



🧠 Переопределение метода (Method Overriding)
Это когда в классе-наследнике мы заново реализуем метод, который уже определён в родительском классе или интерфейсе.

* Определяется на этапе runtime (динамический полиморфизм).
* Сигнатура метода должна быть та же (имя, параметры, порядок, типы).
* Возвращаемый тип может быть ковариантным (подтипом оригинального).
* Доступ не может быть строже, чем у родительского метода.
* Метод родителя должен быть public / protected (не private).
* Для обязательности переопределения используют @Override.

💡 Пример:


class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}

class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}


👉 @BookJava

Читать полностью…
Subscribe to a channel